鱼C论坛

 找回密码
 立即注册
查看: 2013|回复: 29

[已解决]为啥我这个程序算出来的素数会那么大啊

[复制链接]
发表于 2022-4-10 13:42:28 | 显示全部楼层 |阅读模式

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

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

x
  1. #include <stdio.h>

  2. main() {
  3.         int a = 0, b = 0, c = 0;
  4.         for (a = 2; a <= 10000; a++) {
  5.                 for (b = 2;  b <= (a / 2); b++) {

  6.                         if (a % b != 0) {
  7.                                 c += 1;
  8.                         }
  9.                 }

  10.         }
  11.         printf("10000以为一共有%d个素数\n", c);


  12.         return 0;
  13. }
复制代码
最佳答案
2022-4-10 15:08:26
本帖最后由 风车呼呼呼 于 2022-4-10 15:12 编辑

这完全是设计思路上的问题了。。。
我猜你的思路是:
10000以内的素数,那就用a遍历2~10000;
然后用b来从2开始遍历,记录下其中的素数;

我给你几个例子,你想想就知道问题有多大了
1.
a=7时,b<=(a/2)=3,当b=3时,a%b!=0,计数+1
a=8时,b<=(a/2)=4,当b=3时,a%b!=0,计数+1
(素数3被重复统计,同理后面每一个a(非3的倍数)都会统计一次素数3)

2.
很明显,4并不是一个素数
但在你的程序中
a=9时,b<=(a/2)=4,当b=4时,9%4!=0,计数+1
(除不尽就算作是素数,这明显离谱了)
uTools_1649569317314.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-4-10 13:44:47 | 显示全部楼层
这是题目
uTools_1649569476831.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-10 14:12:30 | 显示全部楼层
  1. #include <stdio.h>

  2. main() {
  3.         int a = 0, b = 0, c = 0;
  4.         for (a = 2; a <= 10000; a++) {
  5.                 for (b = 2;  b <= (a / 2); b++) {

  6.                         if (a % b != 0&&b==a/2) {
  7.                                 c += 1;
  8.                         }
  9.                         if(a%b==0)
  10.                         {break;}
  11.                 }

  12.         }
  13.         printf("10000以为一共有%d个素数\n", c);


  14.         return 0;
  15. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-10 14:27:26 | 显示全部楼层

我不理解,为什么不加上if(a%b)==0然后break退出循环的话,素数会多了那么多?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-10 14:30:27 | 显示全部楼层

明明没有满足不等于0这个条件应该是不会增加素数的啊,c语言好奇怪啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-10 15:08:26 | 显示全部楼层    本楼为最佳答案   
本帖最后由 风车呼呼呼 于 2022-4-10 15:12 编辑

这完全是设计思路上的问题了。。。
我猜你的思路是:
10000以内的素数,那就用a遍历2~10000;
然后用b来从2开始遍历,记录下其中的素数;

我给你几个例子,你想想就知道问题有多大了
1.
a=7时,b<=(a/2)=3,当b=3时,a%b!=0,计数+1
a=8时,b<=(a/2)=4,当b=3时,a%b!=0,计数+1
(素数3被重复统计,同理后面每一个a(非3的倍数)都会统计一次素数3)

2.
很明显,4并不是一个素数
但在你的程序中
a=9时,b<=(a/2)=4,当b=4时,9%4!=0,计数+1
(除不尽就算作是素数,这明显离谱了)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-10 15:38:40 | 显示全部楼层
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main(void)
{
        int i, j,k=0;
        for (i = 2; i < 10000; i++)
        {
                for (j = 2; j < i; j++)
                {
                        if (i % j == 0)
                                break;
                }
                if (j >= i)
                {
                        printf("%d ", i); k++;
                }
        }
        printf("\n总共有:%d", k);
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-10 15:41:43 | 显示全部楼层
怕乱就另外写个函数判断素数:
  1. #include <stdio.h>

  2. int isPrime(int num){
  3.     if(num < 2) return 0;
  4.     else if (num == 2) return 1;
  5.     for(int n = 2; n < (num >> 1) + 1; n++){
  6.         if(!(num % n)) return 0;
  7.     }
  8.     return 1;
  9. }

  10. int main()
  11. {
  12.     int sum = 0;
  13.     for(int num = 0; num < 10000; num++){
  14.         if(isPrime(num)) sum++;
  15.     }
  16.     printf("%d", sum);
  17.     return 0;
  18. }
复制代码
  1. 1229
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-10 15:59:08 | 显示全部楼层
#include <stdio.h>
int main()
{
        int a,b,c=0;
       
        for(a=2;a<10000;a++)
        {
                for(b=2;b<a;b++)
                {
                        if(a%b==0)
                        {
                               
                                break;       
                        }
               
                }
                if(b>=a)
                {
                        c=c+1;
                }
               
       
        }
        printf("10000以内的素数有%d个",c);
       
}
1229
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-12 11:05:06 | 显示全部楼层
风车呼呼呼 发表于 2022-4-10 15:08
这完全是设计思路上的问题了。。。
我猜你的思路是:
10000以内的素数,那就用a遍历2~10000;

不好意思,因为昨天有事,所以没有学c,你的回答我看了,我大概了解你的,但是你回答又感觉有点奇怪,素数难道不是只能被1和自身整除的数才叫素数吗,可你第二个回答,素数却做了除数,可是我计算的是a是不是除数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-12 11:26:02 | 显示全部楼层
风车呼呼呼 发表于 2022-4-10 15:08
这完全是设计思路上的问题了。。。
我猜你的思路是:
10000以内的素数,那就用a遍历2~10000;
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         int count = 2; // 已知2和3是素数
  5.         int i, j;
  6.         _Bool flag = 1;

  7.         for (i = 5; i < 10000; i++)
  8.         {
  9.                 for (j = 2; j < i / 2; j++)
  10.                 {
  11.                         if (i % j == 0)
  12.                         {
  13.                                 flag = 0;
  14.                                 break;
  15.                         }
  16.                 }

  17.                 if (flag)
  18.                 {
  19.                         count++;
  20.                 }
  21.                 else
  22.                 {
  23.                         flag = 1;
  24.                 }
  25.         }

  26.         printf("10000以内共有%d个素数!\n", count);

  27.         return 0;
  28. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-12 11:26:35 | 显示全部楼层
风车呼呼呼 发表于 2022-4-10 15:08
这完全是设计思路上的问题了。。。
我猜你的思路是:
10000以内的素数,那就用a遍历2~10000;


我还是不理解,如果说素数会被重复计算的话,为什么小甲鱼这个程序不会呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-12 11:34:59 | 显示全部楼层
1613551 发表于 2022-4-12 11:05
不好意思,因为昨天有事,所以没有学c,你的回答我看了,我大概了解你的,但是你回答又感觉有点奇怪,素 ...

啊是的,当时因为看你判断是否为素数的条件(是否计数+1)本身就有问题,所以就试着猜想了一下你的逻辑,并根据你的逻辑来举一些会出问题的反例
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-12 11:38:20 | 显示全部楼层
风车呼呼呼 发表于 2022-4-12 11:34
啊是的,当时因为看你判断是否为素数的条件(是否计数+1)本身就有问题,所以就试着猜想了一下你的逻辑, ...

你的逻辑我懂了,但是又好像不懂,就比如小甲鱼的程序为什么没有这个问题啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-12 11:39:25 | 显示全部楼层
风车呼呼呼 发表于 2022-4-12 11:34
啊是的,当时因为看你判断是否为素数的条件(是否计数+1)本身就有问题,所以就试着猜想了一下你的逻辑, ...

这是小甲鱼的程序
  1. #include <stdio.h>

  2. int main() {
  3.         int count = 2; // 已知2和3是素数
  4.         int i, j;
  5.         _Bool flag = 1;

  6.         for (i = 5; i < 10000; i++) {
  7.                 for (j = 2; j < i / 2; j++) {
  8.                         if (i % j == 0) {
  9.                                 flag = 0;
  10.                                 break;
  11.                         }
  12.                 }

  13.                 if (flag) {
  14.                         count++;
  15.                 } else {
  16.                         flag = 1;
  17.                 }
  18.         }

  19.         printf("10000以内共有%d个素数!\n", count);

  20.         return 0;
  21. }
复制代码


为什么小甲鱼这样写的话却不会重复计算素数呢?
  1. if (flag) {
  2.                         count++;
  3.                 } else {
  4.                         flag = 1;
  5.                 }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-12 11:40:38 | 显示全部楼层
1613551 发表于 2022-4-12 11:26
我还是不理解,如果说素数会被重复计算的话,为什么小甲鱼这个程序不会呀

上面那个运行应该是没问题的。
这两个程序判断素数条件是完全相反的啊

你的是a除以b一旦除不尽,那就是素数。例:9%4!=0,你的程序就判断9是素数了
后面这个程序是,i一直遍历取余到(i/2),如果一旦取余等于0,那i就不是素数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-12 11:41:06 | 显示全部楼层
风车呼呼呼 发表于 2022-4-12 11:34
啊是的,当时因为看你判断是否为素数的条件(是否计数+1)本身就有问题,所以就试着猜想了一下你的逻辑, ...

比如13是一个素数,它不能被2整除会让count+1,不能被3整除又会让count+,不能被4整数又会让count+1这样子
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-12 11:45:59 | 显示全部楼层
1613551 发表于 2022-4-12 11:39
这是小甲鱼的程序

因为这段计数代码是放在j循环(判断素数代码段)的外面呀,一个i只对应一次可能计数的机会
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-12 11:48:04 | 显示全部楼层
风车呼呼呼 发表于 2022-4-12 11:40
上面那个运行应该是没问题的。
这两个程序判断素数条件是完全相反的啊

噢,我看懂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-12 11:48:43 | 显示全部楼层
风车呼呼呼 发表于 2022-4-12 11:40
上面那个运行应该是没问题的。
这两个程序判断素数条件是完全相反的啊

那么我还有最后一个问题,就是我不太清楚c语言的运行逻辑是啥
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 17:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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