为甚马不能判断质数呀
#include<stdio.h>int main()
{
int a,i,flag;
scanf("%d",&a);
for(i=2;i<a;i++)
{
if(a%i==0)
{
flag=1;
break;
}
}
if(flag==1)
{
printf("%d不是素数",a);
}
else
{
printf("%d是素数",a);
}
return 0;
} #include<stdio.h>
int main(void)
{
int a , i , flag ;
scanf("%d" , & a) ;
flag = 0 ;
if(a > 1) {
if(a % 2 && a % 3 && a % 5 && a % 7) {
for(flag = 1 , i = 3 ; i * i < a + 1 ; i += 2) {
if(! (a % i)) {
flag = 0 ;
break ;
}
}
} else if(a == 2 || a == 3 || a == 5 || a == 7) flag = 1 ;
}
if(! flag) printf("%d 不是素数\n" , a) ;
else printf("%d 是素数\n" , a) ;
} 我这边运行你的代码是 OK 的。。
代码本身的逻辑没有问题,但是范围没有做好控制,0,1,这两个数既不是质数,也不是和数,所以需要判断出来,另外,这样判断的话,效率比较低,算法效率是 O(n^2),用埃拉托色尼算法,可以降低复杂度,下面是代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i, j;
int a;
int b = {2, 3, 5, 7};
for (i = 1; i < 101; i++)
{
a = 1;
}
a = 0;
for (i = 1; i < 101; i++)
{
for (j = 0; j < 4; j++)
{
if (i != b && i % b == 0)
{
a = 0;
}
}
}
for (i = 1; i < 101; i++)
{
if (a == 1)
{
printf("%d\t", i);
}
}
return 0;
}
大体思路就是:
1、确立范围,然后把范围先平方根一把(代码里没有体现出来,但是范围是 100);
2、将2到平方根之间的质数先找到(所以数组b里是 2,3,5,7);
3、将这些质数在步骤1的范围的倍数都找到,然后做标记排除掉;
4、最后将未标记的数输出,得到的就都是质数了;
算法复杂度约为O(n*√n),在此基础上再试试看 foxiangzun 发表于 2022-3-10 18:20
我这边运行你的代码是 OK 的。。
谢谢你的回答 但不知道为什么我这边一直跑不对 一直显示不是质数 我再研究一下吧{:5_109:}
页:
[1]