C语言判断逆反素数,判断素数的几种方法思考[C语言]

判断素数的几种方法思考

【】判断素数是经常遇到的问题,下面就总结几种方法

1、最简单的从2~sqrt(N)的方法(N>=2,下同)

2、筛选法

3、素数判断法

概念说明:

素数,又叫质数,指除了1和它本身外,没有其他因数。(如果你不知道什么叫因数,建议你去从小学2年级开始学习-_-!);

合数:自然就是除了1和它本身外有其他因数。

需指出一点,1既不是质数也不是合数。

因此,判断N是素数的简单而笨的方法就是看看N有没有因数。

1、最简单的方法:

该算法的思想就是用2~sqrt(N),依次去对N求余,只要有一个余数是0,则N是合数。举例如下:

>>CODE

/*-------------isPrimer.c-------------

*----------Date : 09-25-2005---------

*----------All Rights Shared---------

*----------test in C-Free3.5---------

*-----------------------------------*/

#include

#include

#include

void main(int argc, char* argv[])

{

int N, i, m,flag = 0;

if(argc < 2)

{

while(1)

{

printf("Please input a non-integer:");

if(scanf("%d", &N) != 1)

{

fflush(stdin);

continue;

}

break;

}

}

else

N = atoi(argv[1]);

m =(int) sqrt(N*1.0);

for(i = 2;i <= m; i++)

if(N % i ==0)

{

flag = 1;

break;

}

if(flag)

printf("%d is not a primer\n", N);

else

printf("%d is a primer\n", N);

system("pause");

}

注:以上代码判断不出1、2、3来。

上面的代码就是按照这个简单的思路来的,思路是简单了,但是方法效率是不高的。因为我们知道,一个数如果不能被2整除,那么也就不能被4、6、等所有的偶数整除。但是我们的程序在判断了2之后依然会去判断4、6等。所以我们可以把循环规则改变成先判断2,如果不能被2整除就从3开始判断所有的奇数。即:

>>CODE

if(N % 2 != 0)

{

for( i = 3; i <= m; i +=2)

//……此处省略了

}

else

// 合数

2、筛选法判断素数。

这个方法不是用来判断一个素数,而是所有素数的方法。方法的原理是:

QUOTE:http://www.math.utah.edu/classes/216/assignment-07.html

The goal of this assignment is to design a program which will produce lists of prime numbers. The method is based on the one discovered by Erastosthenes (276 - 196 BC). His method goes l ...

这段E文没什么难理解的,就是首先生成数组,然后从第一个开始依次标注它的倍数,然后从下一个没有被标注的开始,标注它所有的倍数,这样依次下去,最后没有被标注的都是素数。下面是代码:

>>CODE

/*----------------------------------------

*--------------筛选法--------------------

*---------------------------------------*/

#include

#include

void main(int argc, char* argv[])

{

int N, i, *m, j = 0,temp;

if(argc < 2)

{

while(1)

{

printf("Please input a non-integer:");

if(scanf("%d", &N) != 1)

{

fflush(stdin);

continue;

} /* end if*/

break;

} /*end while*/

} /* end if*/

else

N = atoi(argv[1]);

m = (int*)malloc(sizeof(int) * (N - 1));

// inital the arry

for(i = 0; i < N -1; i++)

*(m+i) = i+2;

while(1)

{

// find the start number-index

for(; j < N - 2;j++)

if(*(m+j) != 0){temp = *(m+j);break;}

if(j < N - 2)

{

for(i = j+1; i < N - 1; i++)

if(*(m+i) % temp == 0)

*(m+i) = 0;

} /* end if*/

else break;

j++;

} /* end while*/

printf("The primer is:");

for(i = 0; i < N-1; i++)

if(*(m+i) != 0)printf("%d,", *(m+i));

printf("\n");

free(m);

system("pause");

} /* end main */

当然这样占用的空间是相当大的。另外,其实可以省略所有的偶数。

3、素数判断法【简单方法】

考虑到这么一个现实:任何一个合数都可以表现为适当个素数的乘积的形式,所以我们只用素数去除要判断的数即可,比如要判断100以内的素数,只用2,3,5,7就够了,10000以内的数用100以内的素数判断足以。

>>CODE

/*------------------------------------------

*---------------------100以内的素数-------

*-----------------------------------------*/

#include

#include

void main(int argc, char* argv[])

{

int N, i, j = 0,size;

int a[] = {2,3,5,7};

if(argc < 2)

{

while(1)

{

printf("Please input a non-integer:");

if(scanf("%d", &N) != 1)

{

fflush(stdin);

continue;

} /* end if*/

break;

} /*end while*/

} /* end if*/

else

N = atoi(argv[1]);

size = sizeof(a) / sizeof(int);

printf("The primer is:");

for(i =2; i < N; i++)

{

for(j = 0; j < size; j++)

{

if(i == a[j])

printf("%d,", i);

if(i % a[j] == 0)

break;

}

if(j == size)

printf("%d,", i);

}

printf("\n");

system("pause");

} /* end main */

如果是超过了100就要补充a[]的元素,另外循环部分还要做适当改动(比如不用循环size次)。

【总结】:以上3种方法中以第3中效率最高,但是其适用性不高,只适合不大的数。当然,以上3中方法还都可以改进,以后再写。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 我们可以使用以下方法来用C语言判断素数: 1、从2开始,逐个遍历每个数字,直到被测试的数字的平方根。 2、如果可以被2,3,5,7中的任何一个数整除,则不是素数; 3、如果没有数能够整除,则它是素数。 ### 回答2: 判断素数方法判断一个数是否被1和它本身以外的数整除。写成C语言代码如下: ```c #include <stdio.h> int isPrime(int num) { int i; // 判断2到sqrt(num)之间是否有数能整除num for (i = 2; i * i <= num; i++) { if (num % i == 0) { return 0; // 如果有数能整除num,则num不是素数,返回0 } } return 1; // 如果没有数能整除num,则num是素数,返回1 } int main() { int num; printf("请输入一个正整数:"); scanf("%d", &num); if (isPrime(num)) { printf("%d是素数\n", num); } else { printf("%d不是素数\n", num); } return 0; } ``` 以上代码中的`isPrime`函数接受一个正整数作为参数,通过对2到sqrt(num)之间的数进行整除判断判断该数是否为素数。若能整除,则返回0表示不是素数,否则返回1表示是素数。 主函数`main`通过`scanf`函数获取用户输入的正整数,然后调用`isPrime`函数判断该数是否为素数,并根据返回值打印对应的结果。 注意,在判断素数时,只需要判断2到sqrt(num)之间的数,而不需要判断所有小于num的数。这是因为如果num有大于sqrt(num)的约数,那么一定也有小于sqrt(num)的约数。因此只需要判断到sqrt(num)即可。 ### 回答3: 判断一个数是否为素数方法可以通过以下C语言代码来实现: ```c #include <stdio.h> int isPrime(int num) { if (num < 2) { // 0和1不是素数 return 0; } for (int i = 2; i <= num / 2; i++) { if (num % i == 0) { return 0; // 若num能被2到num/2之间的某个数整除则不是素数 } } return 1; // 若没有被整除,则是素数 } int main() { int num; printf("请输入一个整数:"); scanf("%d", &num); if (isPrime(num)) { printf("%d是素数\n", num); } else { printf("%d不是素数\n", num); } return 0; } ``` 该代码中定义了一个函数`isPrime(int num)`来判断一个数是否为素数。首先,若输入的数小于2,则直接返回0(不是素数)。然后,用循环从2开始到num/2去除num,如果存在某个数能整除num,则返回0;否则,返回1(是素数)。在`main`函数中使用`scanf`函数获取输入的整数,然后调用`isPrime`函数进行判断,并输出结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值