您的位置:首页 > 其它

《數據結構與算法分析:C語言描述》習題2.13代碼及自己的想法

2015-08-14 00:18 267 查看


《數據結構與算法分析:C語言描述》習題2.13

大一狗放假在家自學點算法,編程渣,自己練習一下

————————————————————————————————————————(我是劃分線)

题目:編寫一個程序來確定正整數N是否為素數

分析:我採用了一組判別數組,其中下標即為對應是否為N因數的數,元素的值若為true,則說明為判別或者已經判別為N的因數(後者其實可以直接結束函數並返回0,表示N不为素数)

而顯然,因為當k小於等於N的平方根且為N的因數時,必對應另一個因數大於等於N的平方根,所以判別數組的大小只需為sqrt(N)+1 (直接跳過了下標為0的元素,判斷時只遍歷下標1到sqrt(N))。

在循環判別前先對判別數組全部初始化為true(Xcode貌似沒有自帶bool類型,所以在程序開頭用#define語句來定義bool和true,false)。

在判別時,可以注意到,若i不為N的因數,則i的所有整數倍必不為N的因數,所以可以將小於等於sqrt(N)且為i的整數倍的數的對應判別元素的值賦值為false,方便之后对大于i的数字的检查(取整运算应该比判断运算慢吧)

最后,如果程序能执行到最后一个语句(遍历所有循环且未结束),则该数N必為素數,返回1,函數結束。

好了,不多说,上代碼

#include <cstdio>
#include <cmath>
#define bool int
#define true 1
#define false 0
int IsPrime(long long int N);   //若为素数,返回1;否则返回0

int main()
{
long long int n;
printf("Enter the N: ");
scanf("%lld", &n);
printf("%s", IsPrime(n)? "Yes":"No");
return 0;
}

int IsPrime(long long int N)
{
long long int k = sqrt(N);
bool flag[k+1];                   //标志数组,用于找出因数
long long int i;
for ( i=0 ; i<=k ; i++)     //初始化标志数组元素为true,说明下标为N的因数
flag[i]=true;
if ( N == 1 )
return 0;
if ( N==2 || N==3 )
return 1;
else
{
long long int j;
if (N%2==0)                         //判断是否为偶数
return 0;
for ( i=3 ; i<=k ; i+=2 )            //只考虑奇数即可
if ( flag[i] == true  )                 //减少了每个数都要
{
if ( N%i!=0 )
for ( j=1 ; j*i<=k ; j++ )       //若i不为N的因数,则i的整数倍也不会是N的因数
flag[j*i] = false;
else
return 0;
}
}

return 1;      //能执行到该语句的必定为素数
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: