C语言编程判断输入的正整数是否为素数。
输出:一行,对于每个正整数,如果是素数则输出YES,否则输出NO,中间用空格隔开。
以下是我编写的程序
#include<stdio.h>
int main()
{
int n,x[1000],i,k,g=0;
scanf("%d\n",&n);
for(i=0;i<=n-1;i++)
{
scanf("%d",&x[i]);
if(x[i]==1)
printf("NO ");
else if(x[i]==2)
printf("YES ");
else
{
for(k=2;k<=x[i]-1;k++)
{
if(x[i]%k==0)
g=1;
}
if(g==0)
printf("YES ");
else
printf("NO ");
}
}
return 0;
}
为什么不对呢 展开
将:for(k=2;k<=x[i]-1;k++)改成:for(g=0,k=2;k<=x[i]-1;k++)主要是在这个for循环前令g=0。
因为输入的不止一个数,开头的初始化g=0,在第一个数的时候就可能已经被改了。后面的数不重新初始化g=0,就不能保证对了。
思路1):因此判断一个整数m是否是素数,只需把 m 被 2 ~ m-1 之间的每一个整数去除,如果都不能被整除,那么 m 就是一个素数。
思路2):另外判断方法还可以简化。m 不必被 2 ~ m-1 之间的每一个整数去除,只需被 2 ~ √m 之间的每一个整数去除就可以了。
如果 m 不能被 2 ~ √m 间任一整数整除,m 必定是素数。例如判别 17 是是否为素数,只需使 17 被 2~4 之间的每一个整数去除,由于都不能整除,可以判定 17 是素数。
原因:因为如果 m 能被 2 ~ m-1 之间任一整数整除,其二个因子必定有一个小于或等于 √m,另一个大于或等于 √m。
例如 16 能被 2、4、8 整除,16=2*8,2 小于 4,8 大于 4,16=4*4,4=√16,因此只需判定在 2~4 之间有无因子即可。
正确代码如下:
#include<math.h>/*sqrt*/
#include<stdio.h>/*scanf,printf,system*/
int isPrime(int n)//判断n是否为素数,如果是则返回1,否则返回0。
{
if(n<=1)return 0;//小于等于1直接退出。
int i;
for(i = 2; i <= (int)sqrt(n); i ++)//从2到算术平方根遍历。
if(!(n%i)) return 0;//存在约数,不是素数,返回0。
return 1;//不存在约数,返回1,表示为素数。
}
main ()
{
int num;
scanf ("%d", &num);
if ( isPrime( num) )//num是素数。
printf ("%d is a prime",num);
else
printf ("%d isn't a prime",num);//num不是素数。
system("PAUSE");//暂停界面。
return 0;
}
扩展资料:
输入一个正整数或0,判断是否为质数:
#include "stdio.h"
int main()
{
while(1)
{
int n,flag,i;
printf("请输入一个数:");
scanf("%d",&n);
flag = n/2+1;
if(n==0||n==1)
printf("%d既不是质数也不是合数\n",n);
else if(n==2)
printf("%d是质数\n",n);
else
{
for(i=2;i<=flag;i++)
{
if((n%i)==0)
{
printf("%d不是质数,是合数\n",n);
break;
}
if(i==flag&&(n%i)!=0)
printf("%d是质数\n",n);
}
}
}
}
推荐于2017-09-28 · 知道合伙人教育行家
素数:有无限个,除了1和它本身以外不再有其他的因数。所以可以通过for循环从2到n-1依次整除n如果能整除则不是素数,否则就是素数。
参考代码:
#include <stdio.h>
int fun(int n){//判断n是否是素数
int i;
for(i=2;i<n;i++)
if(n%i==0) return 0;
return 1;
}
int main()
{
int n;
scanf("%d",&n);
if(fun(n))
printf("%d是素数!\n",n);
else
printf("%d不是素数!\n",n);
return 0;
}
/*
运行结果:
5
5是素数!
*/
int main()
{
int n,x[1000],i,k,g=0;
scanf("%d\n",&n);
for(i=0;i<=n-1;i++)
{
scanf("%d",&x[i]);
if(x[i]==1)
printf("NO ");
else if(x[i]==2)
printf("YES ");
else
{
for(k=2,g=0;k<=x[i]-1;k++) /*在这里你错了,必须有g=0*/
{
if(x[i]%k==0)
g=1;
}
if(g==0)
printf("YES ");
else
printf("NO ");
}
}
return 0;
}
修改后测试结果正确
请问还有更简单的代码吗
按照你的思路,代码应该不能更简单了,但你定义的数组太大,浪费空间,该为字符变量即可:
#include
int main()
{
int n,a,i,k,g=0; /*x[1000]改为a,后面的也都该为a即可,已经经过测试*/
scanf("%d\n",&n);
for(i=0;i<=n-1;i++)
{
scanf("%d",&a);
if(a==1)
printf("NO ");
else if(a==2)
printf("YES ");
else
{
for(k=2,g=0;k<=a-1;k++) /*在这里你错了,必须有g=0*/
{
if(a%k==0)
g=1;
}
if(g==0)
printf("YES ");
else
printf("NO ");
}
}
return 0;
}
2011-10-23
输出:一行,对于每个正整数,如果是素数则输出YES,否则输出NO,中间用空格隔开。
以下是我编写的程序
#include<stdio.h>
int main()
{
int n,x[1000],i,k,g=0;
scanf("%d\n",&n);
for(i=0;i<=n-1;i++)
{
scanf("%d",&x[i]);
if(x[i]==1)
printf("NO ");
else if(x[i]==2)
printf("YES ");
else
{
for(k=2;k<=x[i]-1;k++)
{
if(x[i]%k==0)
g=1;
}
if(g==0)
....
for(k=2;k<=x[i]-1;k++)
改成:
for(g=0,k=2;k<=x[i]-1;k++)
主要是在这个for循环前令g=0,大概就行了吧?
因为您输入的不止一个数,开头的初始化g=0,在第一个数的时候就可能已经被改了。后面的数不重新初始化g=0,当然就不能保证对了。