曾拥有的方向 发表于 2014-1-26 21:34:46

(已经解决)感谢版主

本帖最后由 曾拥有的方向 于 2014-1-27 14:09 编辑

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

//判断结果是否为素数,是素数返回1,否则返回0
int isPrime(int i)
{
      int n, flag = 1;

      if (1 == i)
      {
                return 0;
      }
      for (n = 2; n < i; n++)
      {
                if (i % n == 0)
                {
                        flag = 0;
                        break;
                }
      }
      if (1 == flag)
      {
                return 1;
      }
      else
      {
                return 0;
      }
}
//判断偶数X是否符合,符合返回1,不符合返回0
int isGoldbach(int x)
{
      int i, flag = 0;
      for (i = 1; i < x / 2; i++)
      {
                if (isPrime(i) && isPrime(x - i)) //如果i和i-1都为素数,则符合条件,标记然后退出循环
                {
                        flag = 1;
                        printf("%d = %d + %d", x, i, x - i);
                        break;
                }
      }
      if (1 == flag)
      {
                return 1;
      }
      else
      {
                return 0;
      }
}
//在low和high范围验证
int testGB_s(int low, int high)
{
      int i, j = 0;
      int flag = 0;
      for (i = low; i < high; i++)
      {
                if (i % 2 == 0 && i>2)
                {
                        if (isGoldbach(i))
                        {
                              j++;
                              if (5 == j)
                              {
                                        printf("\n");
                                        j = 0;
                              }
                        }
                        else
                        {
                              flag = 0;
                              break;
                        }
                        
                }
      }
      if (i == flag)
      {
                return 1;
      }
      else
      {
                return 0;
      }
}

int main()
{
      clock_t start, finish;
      doubleduration;
      start = clock();
      int low, high;
      printf("请输入两个数来验证,数的范围为low-high\n");
      printf("low: ");
      scanf_s("%d", &low);
      printf("\nhigh: ");
      scanf_s("%d", &high);

      if (testGB_s(low, high))
      {
                printf("在%d和%d的范围内,所有的偶数都能分解成两个质数相加,成立\n", low, high);
      }
      else
      {
                printf("在%d和%d的范围内,不是所有的偶数都能分解成两个质数相加,不成立\n", low, high);
      }
      /* 测量这个事件持续的时间*/
      finish = clock();
      duration = (double)(finish - start) / CLOCKS_PER_SEC;
      printf("整个验证过程所用时间为%f seconds\n", duration);
      system("pause");
}

曾拥有的方向 发表于 2014-1-26 21:37:01

本帖最后由 曾拥有的方向 于 2014-1-26 21:53 编辑

时间貌似不太对啊..计算了好几个范围而且里面有错误 帮看看啊 是哪错了

牡丹花下死做鬼 发表于 2014-1-26 22:58:05

本帖最后由 牡丹花下死做鬼 于 2014-1-27 12:38 编辑

代码有误代码见21楼

牡丹花下死做鬼 发表于 2014-1-26 23:07:39

忘了写注释了 不好意思啊

曾拥有的方向 发表于 2014-1-26 23:21:38

牡丹花下死做鬼 发表于 2014-1-26 23:07 static/image/common/back.gif
忘了写注释了 不好意思啊

万分感谢版主哈...

曾拥有的方向 发表于 2014-1-26 23:24:43

牡丹花下死做鬼 发表于 2014-1-26 23:07 static/image/common/back.gif
忘了写注释了 不好意思啊

1>------ 已启动生成:项目: Goldbach conjecture, 配置: Debug Win32 ------
1>源.cpp
1>i:\练习代码\goldbach conjecture\goldbach conjecture\源.cpp(13): error C4996: 'setbuf': This function or variable may be unsafe. Consider using setvbuf instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1>          d:\program files (x86)\microsoft visual studio 12.0\vc\include\stdio.h(292) : 参见“setbuf”的声明
1>i:\练习代码\goldbach conjecture\goldbach conjecture\源.cpp(88): error C2668: “sqrt”: 对重载函数的调用不明确
1>          d:\program files (x86)\microsoft visual studio 12.0\vc\include\math.h(1251): 可能是“long double sqrt(long double) throw()”
1>          d:\program files (x86)\microsoft visual studio 12.0\vc\include\math.h(1135): 或       “float sqrt(float) throw()”
1>          d:\program files (x86)\microsoft visual studio 12.0\vc\include\math.h(521): 或       “double sqrt(double)”
1>          尝试匹配参数列表“(long)”时
========== 生成:成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

报错了啊 版主

牡丹花下死做鬼 发表于 2014-1-26 23:27:01

曾拥有的方向 发表于 2014-1-26 23:24 static/image/common/back.gif
1>------ 已启动生成:项目: Goldbach conjecture, 配置: Debug Win32 ------
1>源.cpp
1>i:\练习代 ...

你怎么建的是C++源文件???

牡丹花下死做鬼 发表于 2014-1-26 23:29:09

曾拥有的方向 发表于 2014-1-26 23:24 static/image/common/back.gif
1>------ 已启动生成:项目: Goldbach conjecture, 配置: Debug Win32 ------
1>源.cpp
1>i:\练习代 ...

VC++6.0 亲测 OK

曾拥有的方向 发表于 2014-1-26 23:32:46

牡丹花下死做鬼 发表于 2014-1-26 23:27 static/image/common/back.gif
你怎么建的是C++源文件???

哦哦 我新建忘改后缀了..不过还是报错一个 关于setbuf的引用问题.我的是VS2013
1>------ 已启动生成:项目: Goldbach conjecture, 配置: Debug Win32 ------
1>源.c
1>i:\练习代码\goldbach conjecture\goldbach conjecture\源.c(13): error C4996: 'setbuf': This function or variable may be unsafe. Consider using setvbuf instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1>          d:\program files (x86)\microsoft visual studio 12.0\vc\include\stdio.h(292) : 参见“setbuf”的声明
========== 生成:成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

曾拥有的方向 发表于 2014-1-26 23:33:56

牡丹花下死做鬼 发表于 2014-1-26 23:29 static/image/common/back.gif
VC++6.0 亲测 OK

以前貌似看到有文章说VS更好的运行C要修改某些选项参数

牡丹花下死做鬼 发表于 2014-1-26 23:36:31

曾拥有的方向 发表于 2014-1-26 23:32 static/image/common/back.gif
哦哦 我新建忘改后缀了..不过还是报错一个 关于setbuf的引用问题.我的是VS2013
1>------ 已启动生成:项 ...

setbuf(stdin,NULL);是为了清空输入流 也可以换成fflush(stdin);

曾拥有的方向 发表于 2014-1-26 23:41:58

牡丹花下死做鬼 发表于 2014-1-26 23:36 static/image/common/back.gif
setbuf(stdin,NULL);是为了清空输入流 也可以换成fflush(stdin);

恩恩 换这个函数就可以了,,为什么最近更新了VS之后 好多次出现scanf函数报错的情况,,看声明我换成scanf_s就可以了这两个是为什么啊?还有我刚运行了,, 所有的结果都是不符合哥德巴赫猜想哇

牡丹花下死做鬼 发表于 2014-1-27 00:25:12

曾拥有的方向 发表于 2014-1-26 23:41 static/image/common/back.gif
恩恩 换这个函数就可以了,,为什么最近更新了VS之后 好多次出现scanf函数报错的情况,,看声明我换成scanf_s ...

我劝你还是下载个VC++6.0吧 VS2013不适合我们这种菜鸟

曾拥有的方向 发表于 2014-1-27 11:10:32

牡丹花下死做鬼 发表于 2014-1-27 00:25 static/image/common/back.gif
我劝你还是下载个VC++6.0吧 VS2013不适合我们这种菜鸟

结果不管我是用什么偶数范围都是返回不符合哥德巴赫猜想...我来回看了好几遍代码..没发现哪块有错啊...为什么啊,还有较大数取到百万以上,执行的时候就会卡住不出结果...版主求教

牡丹花下死做鬼 发表于 2014-1-27 11:16:04

曾拥有的方向 发表于 2014-1-27 11:10 static/image/common/back.gif
结果不管我是用什么偶数范围都是返回不符合哥德巴赫猜想...我来回看了好几遍代码..没发现哪块有错啊... ...

第一个问题你是说我的代码??? 我试过OK啊
第二几百万 要是你的代码的话 定义的是int 不溢出才怪 long int 的范围我也忘了不知道会不会溢出查一下就知道了 C要处理大数比较麻烦你是VS2013支持C99标准最大的就是unsigned long long int了范围挺大的 实在不行要验证大数你就用python吧

曾拥有的方向 发表于 2014-1-27 11:29:30

是啊,,就是用你的代码,, 就是把   setbuf(stdin,NULL)修改成fflush(stdin)   然后scanf修改成scanf_s   ,结果就是不成立..

曾拥有的方向 发表于 2014-1-27 11:31:20

牡丹花下死做鬼 发表于 2014-1-27 11:16 static/image/common/back.gif
第一个问题你是说我的代码??? 我试过OK啊
第二几百万 要是你的代码的话 定义的是int 不溢出才怪 long ...

   而超过百万级运行就会卡在这..

曾拥有的方向 发表于 2014-1-27 11:32:06

曾拥有的方向 发表于 2014-1-27 11:31 static/image/common/back.gif
而超过百万级运行就会卡在这..

按理说long int 不应该啊...根本就没达到上限

牡丹花下死做鬼 发表于 2014-1-27 11:56:02

曾拥有的方向 发表于 2014-1-27 11:29 static/image/common/back.gif
是啊,,就是用你的代码,, 就是把   setbuf(stdin,NULL)修改成fflush(stdin)   然后scanf修改成scanf_s   ,结 ...

代码好像是有点问题 待会我改下

曾拥有的方向 发表于 2014-1-27 12:00:14

牡丹花下死做鬼 发表于 2014-1-27 11:56 static/image/common/back.gif
代码好像是有点问题 待会我改下

恩恩 谢谢啦 ,
页: [1] 2
查看完整版本: (已经解决)感谢版主