鱼C论坛

 找回密码
 立即注册
查看: 1934|回复: 7

[已解决]判断10000内的素数个数

[复制链接]
发表于 2018-9-23 19:54:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 流泪的小鳄鱼 于 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;
}

Cutter_2018-09-23 07_48_56.793.png 这个程序的逻辑是先判断其是否为素数,若是,另a为1,则打印该数,反之无行为,但就很怪,在这里面我定义了一个函数判定某数是否为素数,这个函数单独运行可以,但是糅合进去经调试发现当跑到5的时候就变成不是素数了,求大神赐教
最佳答案
2018-9-23 20:06:11
本帖最后由 claws0n 于 2018-9-23 20:59 编辑
  1. #include <stdio.h>

  2. int fun(int y)
  3. {
  4.         int i;
  5.        
  6.         for(i = 2;i <= (y/2); i++)
  7.         {
  8.                 if(y % i == 0)   
  9.                 {     
  10.                 return 0;
  11.                 }
  12.         }
  13.         return 1;
  14. }


  15. int main()
  16. {
  17.         int x = 10000, s;
  18.         //        printf("????????:");
  19.         //        scanf("%d",&x);
  20.         for(s = 2; s <= x; s++)
  21.         {
  22.                 if(fun(s) == 1)   
  23.                         printf("%d  ",s);
  24.         }
  25.         return 0;
  26. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-9-23 20:06:11 | 显示全部楼层    本楼为最佳答案   
本帖最后由 claws0n 于 2018-9-23 20:59 编辑
  1. #include <stdio.h>

  2. int fun(int y)
  3. {
  4.         int i;
  5.        
  6.         for(i = 2;i <= (y/2); i++)
  7.         {
  8.                 if(y % i == 0)   
  9.                 {     
  10.                 return 0;
  11.                 }
  12.         }
  13.         return 1;
  14. }


  15. int main()
  16. {
  17.         int x = 10000, s;
  18.         //        printf("????????:");
  19.         //        scanf("%d",&x);
  20.         for(s = 2; s <= x; s++)
  21.         {
  22.                 if(fun(s) == 1)   
  23.                         printf("%d  ",s);
  24.         }
  25.         return 0;
  26. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2018-9-23 20:41:04 | 显示全部楼层
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即可。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2018-9-23 20:44:38 | 显示全部楼层
longff9009 发表于 2018-9-23 20:41
1)关键问题:你函数中没有对a,b赋初值,但程序在申请变量空间时,其内部是有一个不可预料的值的,而且这个 ...

我这个只是按楼主的思路的建议,其实还可以简洁到2楼的那样,而且判断素数有好几种算法,楼主有兴趣可以去比较一下哦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-24 09:44:11 | 显示全部楼层
在這獻上修改過的程式,內附解釋為何這樣修改,如還有不清楚在提問,我會竟量回答!!!!
  1. #include <stdio.h>
  2. #include <stdlib.h>//記得加這個,程式的畫面才會停止
  3. int fun(int y) {  //判斷y是不是素數(質數) {
  4.     int i,b;
  5.     for(i = 2;i <= /*(int)*/(y/2);i++){ // 第一這裡的"(int)"是多餘的!!!!
  6.         if(y % i == 0){        //不是素數!!
  7. //          b = 0;  這也不需要," 為什麼 "下面會解釋!!!!!!
  8.                         return 0;//使待會的fun(s)的s=0也就是不成立!!!!!     
  9.             }
  10.         }
  11. //    if(b != 0)    第二(!!!!!!很重要!!!!!!!!)你的b何時不等於" 0 " !!!,你沒寫所以乾脆不要寫這個判斷式
  12.     return 1;//是素數,使s=1也就是成立!!!!
  13. }
  14. int main(){
  15.     int x = 10000, s;
  16. /*  printf("輸入數字: ");  
  17.     scanf("%d",&x);         需要判斷玩家輸入時才加入   */
  18.     for(s = 2; s <= x; s++){
  19.         if(fun(s) == 1)    //确定s是不是素?,是?1,???
  20.                 printf("%d  ",s);        
  21.     }
  22.     system("pause");//這是對應上方的#include <stdlibo.h>
  23.         return 0;
  24. }
复制代码

大致在解釋二樓為何這樣改,同時加入一些個人建議!!
不知道是否解決您的問題,同時也請您找出最佳解答!!感謝
繼續努力學習吧魚油!!!!

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
claws0n + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2018-9-24 21:00:16 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-24 21:11:12 | 显示全部楼层
longff9009 发表于 2018-9-23 20:41
1)关键问题:你函数中没有对a,b赋初值,但程序在申请变量空间时,其内部是有一个不可预料的值的,而且这个 ...

谢谢大神,我懂了。至于那个b,我是为了减少计算次数,当某数x在2到x/2之间只要检测到一个就会退出。你的话我会记住的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-24 21:25:12 | 显示全部楼层
gary冥霧 发表于 2018-9-24 09:44
在這獻上修改過的程式,內附解釋為何這樣修改,如還有不清楚在提問,我會竟量回答!!!!

大致在 ...

非常感谢,很有帮助
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 12:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表