c语言高手速度来$$$$$$$$$$$$$$$$

来源:百度知道 编辑:UC知道 时间:2024/05/13 05:20:09
求100到200间的素数
#include<stdio.h>
#include<math.h>
void main()
{
int i,m,k;
for(m=100;m<=200;m++)
{ k=m-1;
for(i=2;i<=k;i++)
if(m%i==0)break;
if(i>=k) printf("%d ",m); } /*这里i>=k和i==k的结果相同 但下面例子就不同了,为什么呢????? */

getch() ;

}

输入一个数,判断是不是素数
#include<stdio.h>
#include<math.h>
void main()
{
int i,m,k;
scanf("%d",&m);
k=m-1;
if(k>=0&&k<=2)
printf("%d is a prime number\n",m);
else
{for(i=2;i>=2&&i<=k;i++)
if(m%i==0) break;
if (i>=k)printf("%d is a prime number\n",m); /* 为什么这行不可以改成if (i==k)printf("%d is a prime number\n",m); i可能大于k吗????? (我就这里i>=k想不明白,为什么不是i==k?) */
else printf("%d is not a prime number\n",m);

getch() ;

}

各位麻烦你们解释的越详细越好,

首先要说明的是:
你这两个程序都是存在漏洞的。。
如果 如果k 恰好能整除m时,你的程序把m 当素数输出了。
就看这里:
for(i=2;i<=k;i++) //假设i=k时候
if(m%i==0)break; //这里m%i==0成立,break执行跳出循环,此时i=k;
if(i>=k)..... //这里也成立,执行打印语句。这样这个不是素数的m 被打印出来了。

所以,
你这里的if两个例子里面,你改成if(i==k)是个严重的逻辑错误了。。虽然仅有 m=2时k=m-1=1 这一个是你这个逻辑错误的反例。 ,但是这个反例确实存在,而且影响了你的答案。
如果改成if(i>k) 就没有这个逻辑漏洞了。

当i>=k
表示所有的数字都已经除过了

你想想,循环的最后有i++

也就是说,当除完后i还会自加

那么这时候的值是不就比k大1了?
(至少大1个数)

{for(i=2;i>=2&&i<=k;i++)
当i为2执行一次i为3如果你输入为2,1不是都比K大了?

兄弟,你说第一个程序可以用i==k是不是有错哟?第一个程序执行内循环后i根本就不可能等于K,怎么会i>=k跟i==k结果一样呢???如果某个数是素数的话,那么最后i的值就会等于k+1,因为如果这个数是素数,那么内循环就只能是当for循环中的条件为假的时候才跳出内循环,要for的条件为假就只有当i大于k的时候就为假,所以i肯定会比k大1。,也就是说i等于m。如果不是素数的话,i的值肯定就是小于k的。

也就是说你这两个程序实际上是一样的,都不能用i==k来判断,要用等于来断送就只能是写成if(i==m)这才就行了。

主要原因就在于,第一个的输出语句
for(m=100;m<=200;m++)
{ k=m-1;
for(i=2;i<=k;i++)
if(m%i==0)break;
if(i>=k) printf("%d &