判断10000内的素数个数
本帖最后由 流泪的小鳄鱼 于 2018-9-24 21:27 编辑#include <stdio.h>
int fun(int y) //判断x是不是素数
{
int i,b,a;
for(i = 2;i <= (int)(y/2);i ++)
{
if(y % i == 0)
{
a = 0; //不是素数
b = 0;
break;
}
}
if(b)
{
a = 1; //是素数
}
return (a);
}
int main()
{
int x = 10000,s;
// printf("请输入一个正整数:");
// scanf("%d",&x);
for(s = 2; s <= x; s++)
{
if(fun(s) == 1) //确定数是不是素数,是为1,则计数
printf("%d",s);
}
return 0;
}
,这个程序的逻辑是先判断其是否为素数,若是,另a为1,则打印该数,反之无行为,但就很怪,在这里面我定义了一个函数判定某数是否为素数,这个函数单独运行可以,但是糅合进去经调试发现当跑到5的时候就变成不是素数了,求大神赐教{:9_234:} 本帖最后由 claws0n 于 2018-9-23 20:59 编辑
#include <stdio.h>
int fun(int y)
{
int i;
for(i = 2;i <= (y/2); i++)
{
if(y % i == 0)
{
return 0;
}
}
return 1;
}
int main()
{
int x = 10000, s;
// printf("????????:");
// scanf("%d",&x);
for(s = 2; s <= x; s++)
{
if(fun(s) == 1)
printf("%d",s);
}
return 0;
} 1)关键问题:你函数中没有对a,b赋初值,但程序在申请变量空间时,其内部是有一个不可预料的值的,而且这个值一般不会是0。如果你传过来的是素数,执行for循环后,b得不到值,将会是最开始声明变量时程序自动给你的那个不可预料的值,只要那个值不是0,就能执行if(b)的内容,所以能正常返回输出2、3。但是3之后,主函数传递给函数的4不是素数,那么通过for()循环,b将得到一个0,因为你没有人为对它初始化,它将一直保持为0,这样if(b)永远不能执行,a也永远无法变成1,自然后面的就无法再输出。
2)解决办法:在声明变量a或b时,先给它们赋值b=1或a=1,养成好习惯。另外,b其实没有存在的必要,只通过a来判断是否为素数就可以了。默认a=1,即默认是传递过来的是素数,如果遇到被整除的情况,再将a=0,最后返回a即可。 longff9009 发表于 2018-9-23 20:41
1)关键问题:你函数中没有对a,b赋初值,但程序在申请变量空间时,其内部是有一个不可预料的值的,而且这个 ...
我这个只是按楼主的思路的建议,其实还可以简洁到2楼的那样,而且判断素数有好几种算法,楼主有兴趣可以去比较一下哦 在這獻上修改過的程式,內附解釋為何這樣修改,如還有不清楚在提問,我會竟量回答!!!!{:5_106:}
#include <stdio.h>
#include <stdlib.h>//記得加這個,程式的畫面才會停止
int fun(int y) {//判斷y是不是素數(質數) {
int i,b;
for(i = 2;i <= /*(int)*/(y/2);i++){ // 第一這裡的"(int)"是多餘的!!!!
if(y % i == 0){ //不是素數!!
// b = 0;這也不需要," 為什麼 "下面會解釋!!!!!!
return 0;//使待會的fun(s)的s=0也就是不成立!!!!!
}
}
// if(b != 0) 第二(!!!!!!很重要!!!!!!!!)你的b何時不等於" 0 " !!!,你沒寫所以乾脆不要寫這個判斷式
return 1;//是素數,使s=1也就是成立!!!!
}
int main(){
int x = 10000, s;
/*printf("輸入數字: ");
scanf("%d",&x); 需要判斷玩家輸入時才加入 */
for(s = 2; s <= x; s++){
if(fun(s) == 1) //确定s是不是素?,是?1,???
printf("%d",s);
}
system("pause");//這是對應上方的#include <stdlibo.h>
return 0;
}
大致在解釋二樓為何這樣改,同時加入一些個人建議!!{:5_109:}
不知道是否解決您的問題,同時也請您找出最佳解答!!感謝{:5_105:}{:5_108:}
繼續努力學習吧魚油!!!!{:9_231:} claws0n 发表于 2018-9-23 20:06
非常感谢 longff9009 发表于 2018-9-23 20:41
1)关键问题:你函数中没有对a,b赋初值,但程序在申请变量空间时,其内部是有一个不可预料的值的,而且这个 ...
谢谢大神,我懂了{:5_110:}{:5_109:}。至于那个b,我是为了减少计算次数,当某数x在2到x/2之间只要检测到一个就会退出。你的话我会记住的 gary冥霧 发表于 2018-9-24 09:44
在這獻上修改過的程式,內附解釋為何這樣修改,如還有不清楚在提問,我會竟量回答!!!!
大致在 ...
非常感谢,很有帮助{:5_109:}
页:
[1]