首先博主需要道个歉,原来的博客因为博主一时脑袋发热而出现了逻辑上的错误。
现重发一遍:
今天博主想分享学习C语言过程中发现的问题。
首先你需要一本谭浩强编的《C程序设计》,
然后翻至133面,观察一下最中间的程序。
首先我们按照书上的运行结果试一下,
对于327这个数,程序是正确的。
但是下面两个例子就显得这个程序不那么正确了。
很明显,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一定不是素数。
如果仔细分析程序上方的程序分析,我们会发现里面呈现的逻辑和方法都是正确的,但下方的程序却未能完全按照程序分析中来编译,可能是编纂过程中出现了疏忽所致。