判质数的原理就不过多赘述了,请移步C语言求100到500的所有质数,每10个数字一行打印_马拾捌的博客-CSDN博客_c语言每十个一行质数就是只能被1和他自己整除的数字第一次代码优化一个数字的因数里,除了1和自己以外最大的因数一定小于等于自身的一半,换句话讲,一个数字不可能被大于自身一半的数字整除如36的因数,1和自身除外218312496694123182第二次代码优化有了上一次的优化后我们可以尝试列出几个数字的所有因数,例如上图的36(建议用平方根为整数的数字)。不难发现,平方根之后的因数9,12,18所对应的4,3,2重复出现了两次,所以说除重复的因数外,一个数的最大的因数小于等于该数的平方根。...https://blog.csdn.net/mzy5987/article/details/126476764?spm=1001.2014.3001.5501
-
方法一
此方法的核心就在于for循环是如何结束的,其一:不符合循环判断条件,循环结束;其二:在循环体中break提前结束循环。
#include <stdio.h>
#include <math.h>
int main()
{//定义一个变量用来接收用户输入的数据int num;//打印提示语(可有可无)printf("请输入一个大于等于2的正整数: "); //获取用户输入scanf("%d", &num);//首先判断键入的数字是否大于2if(num >= 2){int i;//通过for循环求出2到该数字平方根的所有数字for(i = 2; i <= sqrt(num); i++){//判断:num是否可以被当次循环的数字整除 if(num % i == 0){//如果if的判断条件为假,执行for循环的表达式“i++”//一旦进入判断,说明i是num的因数//break提前结束循环break;}}//根据for循环的执行顺序:表达式1->表达式2->循环体->表达式3//循环体中if语句的判断结果若始终为假,将再次返回到表达式3//执行for循环的表达式“i++”后,for循环的判断条件为假,循环结束//判断:i是否大于数字num的平方根if(i > sqrt(num)){//条件成立:是质数并格式化打印语句printf("%d 是质数\n", num);//否则:不是质数并格式化打印语句}else{ printf("%d 不是质数\n", num); }//键入的数字小于2,打印“ERROR!”}else{printf("ERROR!");}
}
代码运行结果:
-
方法二
此方法中用到一个变量flag去记录是否为质数的状态,默认为1(是质数),经过外层for循环和内层的判断,最终得到flag。最后判断flag的值,为1,是质数;为0,则不是质数。
#include <stdio.h>
#include <math.h>
int main()
{//定义一个变量用来接收用户输入的数据int num;//定义一个变量记录状态(是否为质数),默认是质数int flag = 1;//打印提示语句(可有可无)printf("请输入一个大于等于2的正整数:");//获取用户输入scanf("%d", &num);//判断用户输入的数字是否大于等于2if(num >= 2){//使用for循环求出2到该数字的平方根的所有数字for(int i = 2; i <= sqrt(num); i++){//判断该数字是否能被当次循环的i整除if(num % i == 0){//如果未能整除,则继续执行for循环//如果整除,说明该数不是质数,状态更新为0flag = 0;//使用break提前结束循环break;}}//判断flag是否为1,是1就是质数//if的判断条件的值无非就是真与假,所以这里只写一个flag就够了if(flag)//格式化打印出是质数printf("%d 是质数\n", num);else//否则,该数字就不是质数,格式化打印出不是质数printf("%d 不是质数\n", num);//否则打印ERROR}else{printf("ERROR\n");}
}
代码运行结果: