谁能告诉我第二个for循环发生了什么,是怎么输出100以内所有质数的?想知道一下原理,感谢大神
原理很简单,对于一个数字n(也就是你上面的i),假定从2到n-1都不能被n整除,那么n就是质数,第二个循环就是计算余数的(假定i是19,内存循环就是计算2到18是否能被19整除)
注:你上面程序很多地方都错了。
1:质数是从2开始的,1不是质数,所以你$i和$j的初始值都应该是2,即for($j=2...
2、当检查到可以整除的时候,就该直接break跳出内层循环了,不需要继续执行下去。
3、从2检查到n-1是效率最低的方法,一般只需要检查2到平方根n就可以了,当然其它高效的方法很多,可以自己查一下。
C语言 输出1到100之间的全部素数?
有三种方法:1、输出1-100以内的素数:2、同样,也是输出1-100以内的素数,这个构造一个数组,将其所有元素初始化为1,表示素数,这时取x从2开始,到100以内做循环。若x为素数,即prime[x]!=0,使得每个i*x位置元素置0(prime[i*x]=0),表示为非素数,循环结束前x+1。3、该方法是输出100个素数,基本思想是构造一个素数表,利用函数判断每个数是否能被其之前的素数整除,如果不能,则在素数表内加上该元素,不断循环(while循环结束条件是cnt即数组个数>100)。扩展资料:在这个小程序中主要用到的是for循环for 循环语句的一般形式为:for (表达式1; 表达式2; 表达式3){语句;}需要注意的两点:1) 表达式1、表达式2和表达式3之间是用分号;隔开的,千万不要写成逗号。2) for(表达式1;表达式2;表达式3)的后面千万不要加分号,很多新手都会犯这种错误——会情不自禁地在后面加分号。因为 for 循环只能控制到其后的一条语句,而在C语言中分号也是一个语句——空语句。所以如果在后面加个分号,那么 for 循环就只能控制到这个分号,下面大括号里面的语句就不属于 for 循环了。
c语言 求101到200的素数
问题1:输出结果为什么是个位数是1 3 5 7 9的所有数,且还是都2个重复的。
首先得明白,break只是跳出一层循环,循环之后语句还得执行。
下来是你的逻辑:如果一个数i能被j整除就跳出内循环;如果不能就把它赋值给k,进行下一次内循环。这样的话,当i第一次不能被2整除时,它就会被赋值给k。以后即使出现能被整除的j,跳出,这时i已经赋值给k了,执行printf语句后,就会输出k的值,为i;当i第一次能被2整除时,直接跳出,没有对k进行新的赋值,k还是上一次的值(i-1),执行printf,输出k的值,为i-1。
举个例子吧,比如105,第一次不能被2整除,赋值给k。然后j自加到3时,105会被3整除,break。执行printf,输出k,值为105;到106,第一次能被2整除,跳出,没有对k进行新的赋值,k的值还是(106-1),即105,执行printf,输出k的值,为105。这就是为何你的程序输出了所有的奇数,而且输出了两遍的原因。
问题2:把i=101改为i=100,为什么输出会多一个-858993460。
你并没有对i、j、k进行初始化,而int变量不初始化,默认初始值为即为-858993460。与第一问题有点类似,100第一次会被2整除,直接跳出,没有对k进行新的赋值,k的值还是初始值-858993460,执行printf后,输出k的值,即为-858993460。
知道原因后,程序就很好改了,设置一个标志位,就用k了,k赋初值为0。然后在break之前,置k为1,表明当前i是个非素数。printf之前判断一下k,如果为1,就是非素数,就不输出了;如果为0,就是素数,printf之。
还有,chensunrise7朋友也提到了,判断素数,除数只要判断到小于该数的平方根即可。