鱼C论坛

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

[已解决]为什么少了这么多

[复制链接]
发表于 2019-12-22 12:34:24 | 显示全部楼层 |阅读模式

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

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

x
捕获.PNG
捕获1.PNG
捕获2.PNG
小甲鱼的正确答案是1229我是1206这是为啥啊
最佳答案
2019-12-22 13:45:57
本帖最后由 jackz007 于 2019-12-22 13:57 编辑
孤世星辰 发表于 2019-12-22 13:21
那这个数少的也太多了吧。。。应该不是这个问题


      只要把 flag = 1 时的 i 值打印出来就可以看出,楼主的代码完全漏掉了 100 以内的 25 个素数,而 m 初始值是 2,就是说,漏掉的是 25 - 2 = 23 个素数,而 1206 + 23 = 1229。
      问题还是出在判断素数的条件上。
      下面的代码是完全按楼主的思路修改的版本,供楼主参考:
#include <stdio.h>
#include <math.h>

main(void)
{
        int n                                 ;
        bool flag = 1                         ;
        long i = 2                            ;   // 此处修改
        int m = 0                             ;   // 此处修改
        int x                                 ;
        while(i <= 10000) {
                x = sqrt(i)                   ;   // 此处修改
                for(n = 2 ; n < x + 1 ; n ++) {   // 此处修改
                        if(n < i && i % n == 0) { // 此处修改
                                flag = 0      ;
                                break         ;
                        }
                }
                if(flag) {
                        m ++                  ;
                } else {
                        flag = 1              ;
                }
                i ++                          ;
        }
        printf("10000以内共有%d个素数\n" , m) ;
}
        楼主,下次能不能把代码贴成文本

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-12-22 12:51:23 | 显示全部楼层
本帖最后由 zltzlt 于 2019-12-22 12:55 编辑
#include <stdio.h>
#include <math.h>

int main() {
        int n;
        _Bool flag = 1;
        long i = 5;
        int m = 2;
        int x;
        while (i <= 10000) {
                x = (int) sqrt(i);
                for (n = 2; n < x; n ++) {
                        if (i % n == 0) {
                                flag = 0;
                                break;
                        }
                }
                if (flag) {
                        m ++;
                }
                else {
                        flag = 1;
                }
                i ++;
        }
        printf("%d", m);
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-22 12:56:58 | 显示全部楼层
本帖最后由 jackz007 于 2019-12-22 13:04 编辑

        正确答案的确是 1229 !
#include <stdio.h>
#include <math.h>

main(void)
{
        int d , k , m                                                                  ;
        for(m = 0 , k = 2 ; k < 10000 ; k ++) {
                for(d = 2 ; d < (int) sqrt(k) + 1 ; d ++) if(d < k && ! (k % d)) break ;
                if (d == (int) sqrt(k) + 1) m ++                                       ;
        }
        printf("10000以内共有%d个素数\n" , m)                                          ;
}
        编译、运行实况:
C:\Bin>g++ -o x x.c

C:\Bin>x
10000以内共有1229个素数

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

使用道具 举报

 楼主| 发表于 2019-12-22 13:10:31 | 显示全部楼层

我感觉我的这个跟着这个也一样啊想知道哪里错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-22 13:17:56 | 显示全部楼层
本帖最后由 superbe 于 2019-12-22 14:48 编辑

截图13行 for (n = 2; n < x; n++) 少了一个等号吧, 应该是 n <= x
不判断等号会造成误判一些数为素数(例如一些完全平方数)。
另外x = (int)sqrt(i); 应按zltzlt的代码那样移到while里。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-22 13:21:03 | 显示全部楼层
superbe 发表于 2019-12-22 13:17
截图13行 for (n = 2; n < x; n++) 少了一个等号吧, 应该是 n

那这个数少的也太多了吧。。。应该不是这个问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-22 13:45:57 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2019-12-22 13:57 编辑
孤世星辰 发表于 2019-12-22 13:21
那这个数少的也太多了吧。。。应该不是这个问题


      只要把 flag = 1 时的 i 值打印出来就可以看出,楼主的代码完全漏掉了 100 以内的 25 个素数,而 m 初始值是 2,就是说,漏掉的是 25 - 2 = 23 个素数,而 1206 + 23 = 1229。
      问题还是出在判断素数的条件上。
      下面的代码是完全按楼主的思路修改的版本,供楼主参考:
#include <stdio.h>
#include <math.h>

main(void)
{
        int n                                 ;
        bool flag = 1                         ;
        long i = 2                            ;   // 此处修改
        int m = 0                             ;   // 此处修改
        int x                                 ;
        while(i <= 10000) {
                x = sqrt(i)                   ;   // 此处修改
                for(n = 2 ; n < x + 1 ; n ++) {   // 此处修改
                        if(n < i && i % n == 0) { // 此处修改
                                flag = 0      ;
                                break         ;
                        }
                }
                if(flag) {
                        m ++                  ;
                } else {
                        flag = 1              ;
                }
                i ++                          ;
        }
        printf("10000以内共有%d个素数\n" , m) ;
}
        楼主,下次能不能把代码贴成文本

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

使用道具 举报

 楼主| 发表于 2019-12-25 16:48:31 | 显示全部楼层
本帖最后由 孤世星辰 于 2019-12-25 16:56 编辑
jackz007 发表于 2019-12-22 13:45
只要把 flag = 1 时的 i 值打印出来就可以看出,楼主的代码完全漏掉了 100 以内的 25 个素数,而 ...

 #include <stdio.h>
   #include <math.h>
   int main()
  {
          int n;
         _Bool flag=1;
        long i=5;
         int m=2;
        int x;
         x=(int)sqrt(10000);
         while(i<=10000)
          {
                 for(n=2;n<x;n++)
                 {
                          if(i%n==0)
                          {
                                flag=0;
                                  break;
                         }
                  }
                 if(flag)
                  { 
                          m++;
                  }else
                  {
                         flag=1;
                  }
                 i++;
          }
          printf("10000以内共有%d个素数!\n",m);
 }
噢噢噢噢我会了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-5 05:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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