鱼C论坛

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

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

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

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

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

x
#include <stdio.h>

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

                        if (a % b != 0) {
                                c += 1;
                        }
                }

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


        return 0;
}
最佳答案
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 | 显示全部楼层
#include <stdio.h>

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

                        if (a % b != 0&&b==a/2) {
                                c += 1;
                        }
                        if(a%b==0)
                        {break;}
                }

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


        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> 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 | 显示全部楼层
怕乱就另外写个函数判断素数:
#include <stdio.h>

int isPrime(int num){
    if(num < 2) return 0;
    else if (num == 2) return 1;
    for(int n = 2; n < (num >> 1) + 1; n++){
        if(!(num % n)) return 0;
    }
    return 1;
}

int main()
{
    int sum = 0;
    for(int num = 0; num < 10000; num++){
        if(isPrime(num)) sum++;
    }
    printf("%d", sum);
    return 0;
}
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;
#include <stdio.h>

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

        for (i = 5; i < 10000; i++)
        {
                for (j = 2; j < i / 2; j++)
                {
                        if (i % j == 0)
                        {
                                flag = 0;
                                break;
                        }
                }

                if (flag)
                {
                        count++;
                }
                else
                {
                        flag = 1;
                }
        }

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

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> 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)本身就有问题,所以就试着猜想了一下你的逻辑, ...

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

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

        for (i = 5; i < 10000; i++) {
                for (j = 2; j < i / 2; j++) {
                        if (i % j == 0) {
                                flag = 0;
                                break;
                        }
                }

                if (flag) {
                        count++;
                } else {
                        flag = 1;
                }
        }

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

        return 0;
}

为什么小甲鱼这样写的话却不会重复计算素数呢?
if (flag) {
                        count++;
                } else {
                        flag = 1;
                }
想知道小甲鱼最近在做啥?请访问 -> 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-11-17 22:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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