孤世星辰 发表于 2019-12-22 12:34:24

为什么少了这么多




小甲鱼的正确答案是1229我是1206这是为啥啊

zltzlt 发表于 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;
}

jackz007 发表于 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>

孤世星辰 发表于 2019-12-22 13:10:31

zltzlt 发表于 2019-12-22 12:51


我感觉我的这个跟着这个也一样啊想知道哪里错了

superbe 发表于 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里。

孤世星辰 发表于 2019-12-22 13:21:03

superbe 发表于 2019-12-22 13:17
截图13行 for (n = 2; n < x; n++) 少了一个等号吧, 应该是 n

那这个数少的也太多了吧。。。应该不是这个问题

jackz007 发表于 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) ;
}
      楼主,下次能不能把代码贴成文本

孤世星辰 发表于 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);
}


噢噢噢噢我会了
页: [1]
查看完整版本: 为什么少了这么多