初学C语言的感悟(1)

作者在 2020-04-27 20:30:07 发布以下内容

首先博主需要道个歉,原来的博客因为博主一时脑袋发热而出现了逻辑上的错误。

现重发一遍:


今天博主想分享学习C语言过程中发现的问题。

首先你需要一本谭浩强编的《C程序设计》,

然后翻至133面,观察一下最中间的程序。

捕获6.PNG (上传于2020-05-12 21:57:04)
捕获6.PNG

首先我们按照书上的运行结果试一下,

捕获1.PNG (上传于2020-05-12 21:57:04)
捕获1.PNG

对于327这个数,程序是正确的。

但是下面两个例子就显得这个程序不那么正确了。

1-1.PNG (上传于2020-05-12 21:57:04)
1-1.PNG

2-2.PNG (上传于2020-05-12 21:57:04)
2-2.PNG

很明显,9=3*3,289=17*17,两者皆不是素数。经过多次试验和分析即可得出这个程序在面对一些特定的数字(假设这类数字为n,则n只能sqrt(n)整除)时,程序实际上是输出了错误的结果。

经过简单的人肉运行,博主发现问题出在了最后一个if语句上,最后一个if语句的判断依据来自于上面的for循环,如果输入的n是素数,则i会一直加到k+1,由于i<=k的存在,程序会运行至下方的if语句,此时n=k+1,判定式为假,程序判定n为素数,如果输入的n不是素数(除去上述的特定数字),则i最多加到k-1,程序就会被break打断,进入判定,此时判定式为真,程序判定n不是素数。

这时矛盾就出现了,如果n只能被sqrt(n)整除,则在for循环中i会加至k,此时n%i=0,程序会将k赋值给n,但最后的if语句中判断条件是"i<k",这里的判断条件实际上是漏掉了上述特定数字的情况,从而引发了错误的结果。

这时候一定有爱学习的小伙伴会问,如果将最后的if语句中的判定条件换成i<=k是不是就能解决问题了呢?

答案是肯定的,因为如果输入的是素数,那么i一定会加至k+1,所以如果i<=k,就可以判定i一定不是素数。

捕获.PNG (上传于2020-04-27 20:30:07)
捕获.PNG

如果仔细分析程序上方的程序分析,我们会发现里面呈现的逻辑和方法都是正确的,但下方的程序却未能完全按照程序分析中来编译,可能是编纂过程中出现了疏忽所致。



C语言 | 阅读 1172 次
文章评论,共0条
游客请输入验证码
浏览6247次
最新评论