求解||打印出从1-n的所有素数?c语言?
问题描述:
原题是这样的
1)输入正整数n;
2)判断1-n之间有多少个素数,并输出所有素数。
3)每行输出10个素数,每个素数输出格式使用“%-5d”(宽度5位,数据左对齐);
4)最后打印该区间共有多少个素数(“%d”)。
下面是我写的代码,请问哪里出问题了/?
#include<stdio.h>
#include<math.h>
int main ( )
{
int a,n,i,k,m=0;
scanf("%d",&a);
for(n=1;n<=a;n+=2)
{
k=sqrt(n);
for(i=2;i<=k;i++)
if(n%i==0)break;
if(i>=k+1)
{
printf("%-5d",n);
m=m+1;
}
if(m%10==0)printf("\n");
}
printf("\n");
printf("The total is %-5d\n",m);
return 0;
}
答
#include <stdio.h>
int main ( )
{
int x,n,i=2,j,m=0;
scanf("%d",&n);
if(n<=1){ //1不是素数,也不是合数
printf("The total is %-5d\n",m);
return 0;
}
for(int i=2;i<=n;i++){
x = i;
//1、x是2(2是素数),x/2等于1,不会进入for循环,同时满足j*1.0>x*1.0/2
//2、x是大于2的偶数(大于2的偶数都不是素数),必有x%2 == 0,j是2,不满足j*1.0>x*1.0/2
//3、x是大于2的奇数,x/2必然是小数,如果x%j == 0,则j*1.0<x*1.0/2,不满足j*1.0>x*1.0/2;
//如果x%j == 0都不成立,由于j是整数,且j*1.0 < x*1.0/2,i++导致最后会j*1.0>x*1.0/2,此时是素数
for (j = 2;j*1.0 < x*1.0/2;j++){
if(x%j == 0){
break;
}
}
if(j*1.0>x*1.0/2){ //满足该条件的就是素数
printf("%-5d",x);
m++;
if(m%10==0){
printf("\n");
}
}
}
if(m%10!=0){
printf("\n");
}
printf("The total is %-5d\n",m);
return 0;
}
答
1不是素数,也不是合数