搜索
查看: 1007|回复: 5
打印 上一主题 下一主题

修改了一下验证哥德巴赫猜想,就出错了,我也不知道哪里错了

[复制链接]
跳转到指定楼层
楼主
发表于 2014-11-8 19:59:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
5啊哈币
本帖最后由 rosynirvana 于 2014-11-8 23:47 编辑

根据书上的程序修改了一下验证4~100内的哥德巴赫猜想。
把判断a和b是否为质数的代码修改了一下,就出错了,但是我不知道是哪里出错了TAT,大家帮我看看。
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5.         int k,a,b,i;
  6.     for(k=2,k<=100;k=k+2)
  7.     {
  8.                 for(a=2;a<=k/2;a++)
  9.         {
  10.                         for(i=2;i<=a-1;i++)
  11.             {
  12.                                 if(a%i==0)
  13.                                         break;
  14.                 else
  15.                                         b=k-a;
  16.             }
  17.         }
  18.         for(i=2;i<=b-1;i++)
  19.         {
  20.                         if(b%i==0)
  21.                                 break;
  22.             else
  23.                                 printf("%d=%d+%d",k,a,b);
  24.         }
  25.     }
  26.         system("pause");
  27.         return 0;
  28. }
复制代码



沙发
发表于 2014-11-8 23:39:37 | 只看该作者
for(k=2,k<=100;k=k+2)
语法上面这句错了,是分号不是逗号

语义上面,不知道你要干什么,是验证还是穷举出100以内偶数所有的质数和拆分?
板凳
发表于 2014-11-9 00:07:36 | 只看该作者
本帖最后由 rosynirvana 于 2014-11-9 00:10 编辑
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5.     int k, a, b, i;
  6.     for (k = 2; k <= 100; k = k + 2) {
  7.         for (a = 2; a <= k / 2; a++) {
  8.             for (i = 2; i <= a - 1; i++) {
  9.                 if (a % i == 0)
  10.                     break;
  11.             }

  12.             if (i > a - 1) {
  13.                 b = k - a;
  14.                 for (i = 2; i <= b - 1; i++) {
  15.                     if (b % i == 0)
  16.                         break;
  17.                 }
  18.                 if (i > b - 1)
  19.                     printf("%d=%d+%d\n", k, a, b);
  20.             }
  21.         }
  22.     }
  23.     return 0;
  24. }
复制代码


应该是 对于每个偶数,枚举a -> 验证a是否为质数 -> 如果是验证k-a是否为质数 -> 如果是则输出

验证在这里直接枚举下一个偶数,穷举就继续枚举a
另外验证还应该记录偶数能否进行拆分,如果不能则进行处理。但是4-100之内的质数都符合哥德巴赫猜想,所以不做结果也是正确的。

另外强烈建议把检验质数的代码封装成一个函数,直接这么写看上去乱成一团
地板
 楼主| 发表于 2014-11-9 19:58:55 | 只看该作者
rosynirvana 发表于 2014-11-9 00:07
应该是 对于每个偶数,枚举a -> 验证a是否为质数 -> 如果是验证k-a是否为质数 -> 如果是则输出

验证 ...

谢谢你,就是想验证一下k=a+b中a和b是不是质数,如果不是质数的话就break。
如果证明了a是质数,那么b=k-a,再验证b是不是质数,b也是质数的话就输出。
我没有看懂if(i>a-1)是什么意思……
5#
发表于 2014-11-9 23:15:23 | 只看该作者
wx_B0gU1qNU 发表于 2014-11-9 19:58
谢谢你,就是想验证一下k=a+b中a和b是不是质数,如果不是质数的话就break。
如果证明了a是质数,那么b=k ...

所以说强烈建议你把验证质数那部分封装成一个函数……

for(i=2;i<=a-1;i++)
            {
                                if(a%i==0)
                                        break;
                else
                                        b=k-a;
            }

这里,要整个循环都跑完了才能知道a是不是质数,不是一次试除不能整除后就能知道的,你这么写估计是理解错了

i > a - 1就是去读上面质数检验的结果,如果i比a-1还大说明所有的试除都失败,a是个质数,你跳过了这一步等于没去验证a是不是质数

下面的i > b - 1同理
6#
发表于 2015-9-26 16:36:10 | 只看该作者
本帖最后由 apas 于 2015-9-26 17:04 编辑
rosynirvana 发表于 2014-11-9 00:07
应该是 对于每个偶数,枚举a -> 验证a是否为质数 -> 如果是验证k-a是否为质数 -> 如果是则输出

验证 ...

4=2+2显示不出dddddd
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表