鱼C论坛

 找回密码
 立即注册
查看: 961|回复: 2

[已解决]按照素数定义输出素数失败

[复制链接]
发表于 2020-12-29 14:50:10 | 显示全部楼层 |阅读模式

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

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

x
按照素数的定义对每一个数和他之前的数进行取余,如果不为零就输出,为什么没有输出?
#include <stdio.h>
main()
{
        int N,a=0,b[N],c=0;
        scanf("%d",&N);
        for(int i=0;i<N;i++)
        {
                while(a<=i)
                {
                        b[c]=i%a;
                        a++;
                        c++;        
                }
                
                for(a=0;a<i;a++)
                {
                        if(b[a]!=0)
                        printf("%d",i);
                }
                
        }
 } 
最佳答案
2020-12-29 17:14:13
本帖最后由 jackz007 于 2020-12-29 17:32 编辑

        已经按照你的思路改好
#include <stdio.h>

int main(void)
{
        int N  , a , b[50000] , c  , i       ;
        scanf("%d" , & N)                    ;
        for(i = 2 ; i < N + 1 ; i ++) {
                a = 2                        ; // 很有必要,对于每一个 i 都必须初始化
                c = 0                        ; // 很有必要,对于每一个 i 都必须初始化
                while(a * a < i + 1)           // 不必循环到 a = i,根据乘法交换律,只需要循环一半次数即可
                {
                        b[c] = i % a         ;
                        a ++                 ;
                        c ++                 ;
                }
                for(a = 0 ; a < c ; a ++)      // 一共产生了 c 个余数
                {
                        if(b[a] == 0) break  ; // 如果有余数为 0 值,说明 i 不是素数,中断循环
                }
                if(a == c) printf(" %d" , i) ; // 如果循环是正常结束的,说明没有找到 0 值余数,那 i 就是素数无疑
        }
}
        判断素数要看在所有余数中,是否存在 0 值元素,如果存在就不是,所以,否定素数可以在检查余数的循环中,而肯定素数必须得在检查余数的循环完成后才可以,这是楼主代码存在的主要问题之一。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-29 17:14:13 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2020-12-29 17:32 编辑

        已经按照你的思路改好
#include <stdio.h>

int main(void)
{
        int N  , a , b[50000] , c  , i       ;
        scanf("%d" , & N)                    ;
        for(i = 2 ; i < N + 1 ; i ++) {
                a = 2                        ; // 很有必要,对于每一个 i 都必须初始化
                c = 0                        ; // 很有必要,对于每一个 i 都必须初始化
                while(a * a < i + 1)           // 不必循环到 a = i,根据乘法交换律,只需要循环一半次数即可
                {
                        b[c] = i % a         ;
                        a ++                 ;
                        c ++                 ;
                }
                for(a = 0 ; a < c ; a ++)      // 一共产生了 c 个余数
                {
                        if(b[a] == 0) break  ; // 如果有余数为 0 值,说明 i 不是素数,中断循环
                }
                if(a == c) printf(" %d" , i) ; // 如果循环是正常结束的,说明没有找到 0 值余数,那 i 就是素数无疑
        }
}
        判断素数要看在所有余数中,是否存在 0 值元素,如果存在就不是,所以,否定素数可以在检查余数的循环中,而肯定素数必须得在检查余数的循环完成后才可以,这是楼主代码存在的主要问题之一。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-29 19:02:00 | 显示全部楼层
jackz007 发表于 2020-12-29 17:14
已经按照你的思路改好

        判断素数要看在所有余数中,是否存在 0 值元素,如果存在就不是 ...

感谢,明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 06:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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