|
网站首页
|
业界新闻
|
小组
|
威客
|
人才
|
下载频道
|
博客
|
代码贴
|
在线编程
|
编程论坛
|
登录
注册
短消息
我发表的主题
我参与的主题
我收藏的贴子
我上传的附件
我下过的附件
编辑个人资料
我的博客
用户控制面板
搜索
道具
恢复默认风格
碧海青天
秋意盎然
棕红预览
粉色回忆
蓝雅绿
紫色淡雅
青青河草
e点小镇
橘子红了
红红夜思
水晶紫色
雪花飘飘
新年快乐
风格
短消息
论坛展区
帮助
编程论坛
→
开发语言
→
『 C语言论坛 』
→ 这个C函数的逻辑错到底在那里?
我的收件箱(0)
欢迎加入我们,一同切磋技术
用户名:
密 码:
共有
1392
人关注过本帖
标题:
这个C函数的逻辑错到底在那里?
只看楼主
加入收藏
syjojg
等 级:
论坛游民
帖 子:73
专家分:10
注 册:2008-9-12
楼主
收藏
问题点数:0 回复次数:19
这个C函数的逻辑错到底在那里?
大家好:
以下是一个判断输入数字是否为素数的C源码。在这个改错题中指出下面有逻辑错误,但我把此函数在WIN-TC运行了几次,显示结果正确。请问出在那里?
int isprime(int x)
{ int k,yes;
for (k=2;k<=x/2;k++)
if (x%k==0) yes=0;
else yes=1;
return yes;
}
搜索更多相关主题的帖子:
函数
逻辑
2008-09-12 15:44
举报帖子
使用道具
赠送鲜花
StarWing83
来 自:仙女座大星云
等 级:
贵宾
威 望:
19
帖 子:3951
专家分:748
注 册:2007-11-16
第
2
楼
收藏
得分:0
1:当x<=2的时候,输出结果无定义。
2:这个程序本质是判断x是不是会被x/2整除,判断素数是这么定义的么?
正确代码如下:
int isprime(int x)
{
int k, kmax = sqrt(x);
if (x < 2) return 0;
for (k = 2;k <= kmax;k++)
if (x % k == 0) return 0;
return 1;
}
专心编程………
飞燕算法初级群:3996098
我的Blog
2008-09-12 16:01
举报帖子
使用道具
赠送鲜花
落在秋天的叶
等 级:
新手上路
帖 子:77
专家分:9
注 册:2008-6-21
第
3
楼
收藏
得分:0
我看了半天觉得这个题目的FOR循环好象是多余的,整个就执行一次FOR循环就结束了。这个函数的意思就是凡是能被2整除的数都不是素数。。。。可能这个就是逻辑错误吧 献丑了。。。。期待更好的答案。。。
2008-09-12 16:02
举报帖子
使用道具
赠送鲜花
StarWing83
来 自:仙女座大星云
等 级:
贵宾
威 望:
19
帖 子:3951
专家分:748
注 册:2007-11-16
第
4
楼
收藏
得分:0
怎么会执行一次呢?假设x=21,则x/2=10,则会执行2~10共九次,但是前八次执行以后,其结果都被后面的覆盖掉了,yes真正的值是其第九次循环的值,即1,所以21就是素数了= =
这才是逻辑问题……
专心编程………
飞燕算法初级群:3996098
我的Blog
2008-09-12 16:45
举报帖子
使用道具
赠送鲜花
forever74
来 自:CC
等 级:
版主
威 望:
58
帖 子:1692
专家分:4282
注 册:2007-12-27
第
5
楼
收藏
得分:0
附议
2008-09-12 17:37
举报帖子
使用道具
赠送鲜花
瓦莱塔
等 级:
新手上路
帖 子:7
专家分:0
注 册:2008-9-12
第
6
楼
收藏
得分:0
2楼版主的程序是对的
说的第一点我也赞同,这个程序健壮性不够
第二点不赞同,楼主的程序本质并不是判断x是不是会被x/2整除,楼主的程序是把2到X/2范围内的整数去除被判断数,而我们通常用2到根号X(即sqrt(x))的范围去除,楼主的做法把判断范围扩大了,程序效率降低了,但这是没有错的,可能版主一时看走眼了
至于为什么判断素数可以用从2到根号X的数去除,这是一个数学问题。
假如X可以分解成除自身和1以外的因数,因为因数总是成对的,如果有大于根号X的因数那么跟它对应的因数肯定在根号X之前出现了。比如64=1*64=2*32=4*16=8*8,除了1和64外,其中因数16、32对应的因数4、2早已在从2到8(即根号64)的判断过程中作出判断了。所以最多只需要判断到根号X就够了。
2008-09-13 18:32
举报帖子
使用道具
赠送鲜花
StarWing83
来 自:仙女座大星云
等 级:
贵宾
威 望:
19
帖 子:3951
专家分:748
注 册:2007-11-16
第
7
楼
收藏
得分:0
LS:注意一个问题,在判断n是否为素数的时候,是一旦发现一个i<=sqrt(n)能整除n的时候,就马上可以得出n不是素数。但是LZ的程序中,就算在x/2之前,有一个数字可以被x整除(这个时候,根据LZ程序的逻辑,设置yes=0),在计算新的值的时候,yes也会被新的值覆盖掉。
请LS判别下面两个程序的区别:
for(i=2;i<x/2;i++)if(x%i == 0)yes=0; else yes=1;
for(i=2;i<x/2;i++)if(x%i == 0){yes=0;[bo]break;[/bo]}else yes=1;
专心编程………
飞燕算法初级群:3996098
我的Blog
2008-09-13 19:05
举报帖子
使用道具
赠送鲜花
瓦莱塔
等 级:
新手上路
帖 子:7
专家分:0
注 册:2008-9-12
第
8
楼
收藏
得分:0
我知道,可你在2楼的程序也没有break,从格式上看好象最后返回值始终是1,因为你的return 1在FOR循环之外啊,但运行却正确,根据试验的结果我说你的程序是正确的,为什么呢?这也是我其中一个不明白之处,请赐教
你说的第二句“程序本质是判断x是不是会被x/2整除”是错了吧?
2008-09-14 16:01
举报帖子
使用道具
赠送鲜花
StarWing83
来 自:仙女座大星云
等 级:
贵宾
威 望:
19
帖 子:3951
专家分:748
注 册:2007-11-16
第
9
楼
收藏
得分:0
哎……楼上的粗心可见一斑………………
第一,我的程序里面,在for里面有个return看见没?一判断不是素数就马上返回0了。所以循环过后还没有返回的一定是素数。
第二,我没有说错,本质上只判断了x能不能被x/2整除,前面的的确判断过,但是结果丢弃了!!yes变量保存的值,只是最后一次的结果。
yes=1;yes=0;yes=1;yes=0;
上面一行语句,执行了以后yes等于几??
麻烦认真一点。
专心编程………
飞燕算法初级群:3996098
我的Blog
2008-09-14 19:11
举报帖子
使用道具
赠送鲜花
瓦莱塔
等 级:
新手上路
帖 子:7
专家分:0
注 册:2008-9-12
第
10
楼
收藏
得分:0
觉得版主说话不太友好
你说“一判断不是素数就马上返回0了”这个我看到了,也明白,并不是粗心。我的意思是说你的return 1在FOR循环之外,那不是执行完FOR循环后接下来还执行一次return 1吗,那不是把前面判断return 0的结果覆盖了吗?但是运行的事实证明你这样写没错还是能返回0值的,那就是我理解错了。所以我请你赐教一下我对语法的理解错在哪里
2008-09-14 23:12
举报帖子
使用道具
赠送鲜花
20
1/2页
1
2
快速回复:
这个C函数的逻辑错到底在那里?
数据加载中...
关于我们
|
广告合作
|
编程中国
|
清除Cookies
|
TOP
|
手机版
编程中国
版权所有,并保留所有权利。
Powered by
Discuz
, Processed in 0.016638 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved