鱼C论坛

 找回密码
 立即注册
查看: 3687|回复: 21

(已经解决)感谢版主

[复制链接]
发表于 2014-1-26 21:34:46 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 曾拥有的方向 于 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;
        double  duration;
        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");
}
QQ截图20140126213606.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-1-26 21:37:01 | 显示全部楼层
本帖最后由 曾拥有的方向 于 2014-1-26 21:53 编辑

时间貌似不太对啊..计算了好几个范围  而且里面有错误 帮看看啊 是哪错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-1-26 22:58:05 | 显示全部楼层
本帖最后由 牡丹花下死做鬼 于 2014-1-27 12:38 编辑
代码有误代码见21楼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-1-26 23:07:39 | 显示全部楼层
忘了写注释了 不好意思啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-26 23:21:38 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-26 23:24:43 | 显示全部楼层
牡丹花下死做鬼 发表于 2014-1-26 23:07
忘了写注释了 不好意思啊

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 个 ==========

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

使用道具 举报

发表于 2014-1-26 23:27:01 | 显示全部楼层
曾拥有的方向 发表于 2014-1-26 23:24
1>------ 已启动生成:  项目: Goldbach conjecture, 配置: Debug Win32 ------
1>  源.cpp
1>i:\练习代 ...

你怎么建的是C++源文件???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-1-26 23:29:09 | 显示全部楼层
曾拥有的方向 发表于 2014-1-26 23:24
1>------ 已启动生成:  项目: Goldbach conjecture, 配置: Debug Win32 ------
1>  源.cpp
1>i:\练习代 ...

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

使用道具 举报

 楼主| 发表于 2014-1-26 23:32:46 | 显示全部楼层
牡丹花下死做鬼 发表于 2014-1-26 23:27
你怎么建的是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 个 ==========
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-26 23:33:56 | 显示全部楼层
牡丹花下死做鬼 发表于 2014-1-26 23:29
VC++6.0 亲测 OK

以前貌似看到有文章说VS更好的运行C要修改某些选项参数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-1-26 23:36:31 | 显示全部楼层
曾拥有的方向 发表于 2014-1-26 23:32
哦哦 我新建忘改后缀了..不过还是报错一个 关于setbuf的引用问题.我的是VS2013
1>------ 已启动生成:  项 ...

setbuf(stdin,NULL);是为了清空输入流 也可以换成fflush(stdin);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-26 23:41:58 | 显示全部楼层
牡丹花下死做鬼 发表于 2014-1-26 23:36
setbuf(stdin,NULL);是为了清空输入流 也可以换成fflush(stdin);

恩恩 换这个函数就可以了,,为什么最近更新了VS之后 好多次出现scanf函数报错的情况,,看声明我换成scanf_s就可以了这两个是为什么啊?  还有我刚运行了,, 所有的结果都是不符合哥德巴赫猜想哇
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-1-27 00:25:12 | 显示全部楼层
曾拥有的方向 发表于 2014-1-26 23:41
恩恩 换这个函数就可以了,,为什么最近更新了VS之后 好多次出现scanf函数报错的情况,,看声明我换成scanf_s ...

我劝你还是下载个VC++6.0吧 VS2013不适合我们这种菜鸟
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-27 11:10:32 | 显示全部楼层
牡丹花下死做鬼 发表于 2014-1-27 00:25
我劝你还是下载个VC++6.0吧 VS2013不适合我们这种菜鸟

结果不管我是用什么偶数范围都是返回不符合哥德巴赫猜想...  我来回看了好几遍代码..没发现哪块有错啊...为什么啊  ,还有较大数取到百万以上,执行的时候就会卡住不出结果...版主求教
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-1-27 11:16:04 | 显示全部楼层
曾拥有的方向 发表于 2014-1-27 11:10
结果不管我是用什么偶数范围都是返回不符合哥德巴赫猜想...  我来回看了好几遍代码..没发现哪块有错啊... ...

第一个问题你是说我的代码??? 我试过OK啊
第二几百万 要是你的代码的话 定义的是int 不溢出才怪 long int 的范围我也忘了不知道会不会溢出查一下就知道了 C要处理大数比较麻烦你是VS2013支持C99标准最大的就是unsigned long long int了范围挺大的 实在不行要验证大数你就用python吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-27 11:29:30 | 显示全部楼层
是啊,,就是用你的代码,, 就是把   setbuf(stdin,NULL)修改成fflush(stdin)   然后scanf修改成scanf_s   ,结果就是不成立.. 13.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-27 11:31:20 | 显示全部楼层
牡丹花下死做鬼 发表于 2014-1-27 11:16
第一个问题你是说我的代码??? 我试过OK啊
第二几百万 要是你的代码的话 定义的是int 不溢出才怪 long ...

14.jpg    而超过百万级运行就会卡在这..
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-27 11:32:06 | 显示全部楼层
曾拥有的方向 发表于 2014-1-27 11:31
而超过百万级运行就会卡在这..

按理说long int 不应该啊...根本就没达到上限
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-1-27 11:56:02 | 显示全部楼层
曾拥有的方向 发表于 2014-1-27 11:29
是啊,,就是用你的代码,, 就是把   setbuf(stdin,NULL)修改成fflush(stdin)   然后scanf修改成scanf_s   ,结 ...

代码好像是有点问题 待会我改下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-27 12:00:14 | 显示全部楼层
牡丹花下死做鬼 发表于 2014-1-27 11:56
代码好像是有点问题 待会我改下

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 23:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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