《數據結構與算法分析: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;      //能执行到该语句的必定为素数
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值