c语言求改错:输入一个整数,输出该范围内最大的素数(质数)。我写出来了,但是运行的不对,请高手更正
void main()
{int i,j,m,n;
scanf("%d",&m); //输入范围
i=3,j=2;
while(i<=m)
{
while(j<i)
{if(i%j==0)break; //一旦发现该数字能被整除就跳出子循环切到下一个数字
j++;
if(j==i)n=i;
}
i++; //下一个需要判断的数字
}
printf("%d",n); //输出范围内最大的素数
} 展开
19Press any key to continue
#include <stdio.h>
void main()
{
int i,j,m,n;
scanf("%d",&m); //输入范围
i=3,j=2;
while(i<=m)
{
j=2;
while(j<i)
{
if(i%j==0)break; //一旦发现该数字能被整除就跳出子循环切到下一个数字
j++;
if(j==i)
n=i;
}
i++; //下一个需要判断的数字
}
printf("%d",n); //输出范围内最大的素数
}
//用for更清晰点,道理如楼上,每i++,j就要从2开始循环超找,故在第二个循环要初始化j
void main()
{
int i = 0,j = 0,m = 0,n = 0;
scanf("%d",&m);
for(i=3;i<=m;i++)
{
for(j=2;j<i;j++)
{
if(i%j==0)
break;
}
if(j==i)
n=i;
}
printf("%d\n",n);
}
C程序:
#include <stdio.h>
void main()
{
int i,j,m,n;
scanf("%d",&m);
i=3;
j=2;
while(i<=m)
{
j=2; /* 唯一改动处 */
while(j<i)
{
if(i%j==0)
break;
j++;
if(j==i)
n=i;
}
i++;
}
printf("%d",n);
}
说明:按你的程序思路,m是最大数,i是用于从3开始试探,找到最大的素数,j是i的潜在因子,如果j是i的因子,说明i不是素数。由于i会变化,每次测试i是否有因子时,j都应该从2开始重新试探,故需要加上“j=2”这一句。
你的程序还有一个问题:如果输入2,结果不对,因为你的i总是从3开始。
还有一个缺陷:效率不高,求某范围的最大素数,完全可以按m、m-1、m-2 ... 2这样的顺序进行试探,而且可以排除所有偶数。
这是我修改后的程序:
#include <stdio.h>
#include <math.h>
void main()
{
int i,j, k, m;
scanf("%d", &m);
if(m < 2)
return;
else if(m == 2)
{
printf("%d", m);
return;
}
for(i=m; i>=2; i--)
{
k = (int)sqrt(i);
for(j=2; j<=k; j++)
if(i%j == 0)
break;
if(j > k)
break;
}
printf("%d", i);
}
运行测试: