| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1392 人关注过本帖
标题:这个C函数的逻辑错到底在那里?
只看楼主 加入收藏
syjojg
Rank: 2
等 级:论坛游民
帖 子: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
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分: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
落在秋天的叶
Rank: 1
等 级:新手上路
帖 子:77
专家分:9
注 册:2008-6-21
收藏
得分:0 
我看了半天觉得这个题目的FOR循环好象是多余的,整个就执行一次FOR循环就结束了。这个函数的意思就是凡是能被2整除的数都不是素数。。。。可能这个就是逻辑错误吧 献丑了。。。。期待更好的答案。。。
2008-09-12 16:02
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
怎么会执行一次呢?假设x=21,则x/2=10,则会执行2~10共九次,但是前八次执行以后,其结果都被后面的覆盖掉了,yes真正的值是其第九次循环的值,即1,所以21就是素数了= =
这才是逻辑问题……

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-09-12 16:45
forever74
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:CC
等 级:版主
威 望:58
帖 子:1687
专家分:4252
注 册:2007-12-27
收藏
得分:0 
附议
2008-09-12 17:37
瓦莱塔
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2008-9-12
收藏
得分: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
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分: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
瓦莱塔
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2008-9-12
收藏
得分:0 
我知道,可你在2楼的程序也没有break,从格式上看好象最后返回值始终是1,因为你的return 1在FOR循环之外啊,但运行却正确,根据试验的结果我说你的程序是正确的,为什么呢?这也是我其中一个不明白之处,请赐教

你说的第二句“程序本质是判断x是不是会被x/2整除”是错了吧?
2008-09-14 16:01
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
哎……楼上的粗心可见一斑………………

第一,我的程序里面,在for里面有个return看见没?一判断不是素数就马上返回0了。所以循环过后还没有返回的一定是素数。

第二,我没有说错,本质上只判断了x能不能被x/2整除,前面的的确判断过,但是结果丢弃了!!yes变量保存的值,只是最后一次的结果。
yes=1;yes=0;yes=1;yes=0;

上面一行语句,执行了以后yes等于几??

麻烦认真一点。

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-09-14 19:11
瓦莱塔
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2008-9-12
收藏
得分:0 
觉得版主说话不太友好

你说“一判断不是素数就马上返回0了”这个我看到了,也明白,并不是粗心。我的意思是说你的return 1在FOR循环之外,那不是执行完FOR循环后接下来还执行一次return 1吗,那不是把前面判断return 0的结果覆盖了吗?但是运行的事实证明你这样写没错还是能返回0值的,那就是我理解错了。所以我请你赐教一下我对语法的理解错在哪里
2008-09-14 23:12
快速回复:这个C函数的逻辑错到底在那里?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012938 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved