C语⾔中怎么判断⼀个数是否是素数(即质数)
最近在重新学习C语⾔,因为以前学的东西太少太少,像指针使⽤什么的都不熟悉。所以决定买本书好好看看。在边看书边实践的过程中有⼀个很经典的问题需要解决。
就是怎么判断⼀个读⼊的整数是否是素数,如果不是并打印其约数。
当然,对我来说还是很简单的。很快的就解决了,所以分享⼀下⾃⼰的理解吧,希望⼤家能或多或少的有点收获。
⾸先,什么是素数(质数)?
数学的概念中,素数就是只能被1和它本⾝所整除的整数。但是有⼀个例外,就是1不属于素数。所以你在输⼊⼀个整数并加以判断的时候就需要考虑这种情况了。如下即可:
while(scanf("%lu", &num) == 1 && num != 1)
这⾥⽤到了while循环来判断输⼊的数值并加以判断,如果输⼊格式正确的话会返回⼀个1并将输⼊的数值存⼊num这个变量中,然后再判断num的值是否为1。
在这⾥有⼀条很好⽤的规则⽤于素数的判断:测试的数只需要界于2到num的平⽅根之间的所有数,看它们是否可以整除num。如果可以整除,说明输⼊的数不是素数;反之,说明输⼊的数是素数。
到这⾥,就会有⼈说平⽅根怎么求,其实这个很好解决。你完全可以像下⾯这样描述判断条件:
for(div = 2; (div * div) <= num;div++){
if(num % div == 0){
if((div * div) != num){
printf("%lu is divisible by %lu and %lu.\n", num, div, num / div);
}else {
printf("%lu is divisible by %lu.\n", num, div);
}
}
}
在这⾥,在if条件语句⾥⾯还嵌套了⼀个if条件语句,⽤来判断两个约数是否是⼀样的,⽐如144,约数是12和12,这时候就只需要打印⼀个约数即可。
第⼆,我们怎样知道⼀个数数素数呢?
如果num是素数,程序流程永远也进不了if语句中。为了解决这个问题,可以在循环外设置⼀个变量为某⼀值,⽐⽅说1,在if语句中将这个变量重设为0。那么,循环完成后,可以检查该变量是否仍然是1。如果是,则从没进⼊过if语句,这个数是素数。我这⾥⽤int类型的变量isPrime来当作⼀个标志实现这个想法。
好了,结合上⾯的所有想法,我们开始写代码了:
#include<stdio.h>
int main(void)
{
unsigned long num;// 要检查的数
unsigned long div;// 可能的约数
int isPrime;// 素数的标志,1代表是素数,0代表不是素数
printf("Please enter an integer for analysis. ");
printf("Enter q to quit.\n");
while(scanf("%lu", &num) == 1 && num != 1)
{
for(div = 2, isPrime = 1;(div * div) <= num; div++){
if(num % div == 0){// 如果能被div整除
if((div * div) != num){// 约数不相等
printf("%lu is divisible by %lu and %lu.\n", num, div, num / div);
}else{// 约数相同
printf("%lu is divisible by %lu.\n", num, div);
c++判断素数
}
// 将isPrime设置为0,表⽰其不是⼀个素数
isPrime = 0;
}
}
if(isPrime == 1){
printf("%lu 是素数.\n", num);
}
printf("Please enter another integer for analysis. ");
printf("Enter q to quit.\n");
}
printf("Bye.\n");
return0;
}
这⾥有⼀个关键就是,在for循环控制表达式中使⽤了逗号运算符,以针对每个新输⼊的数将isPrime初始化为1。下⾯演⽰⼀些输⼊的⽰例:
好了,运⾏后的结果都是正确的,⼤家也可以⾃⼰试试看。每天进步⼀点点!加油!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论