解题思路:
定义一个数组prime[],赋初值为0,数组下表对应这个数字,通过数组值来判断是否为素数
ex:
prime[2]==0 表示2为素数 prime[8]==1 表示8不为素数
根据算术基本定理:任何一个大于1的自然数 N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积
所以若prime[i]==0,则prime[i*j]==1 即prime[i*j]不为素数
只要i:2->n 即可构建n以内的质数表
注意事项:
prime[0]=prime[1]=1; //0 1特殊处理
参考代码:
#include<stdio.h> int main(){ int prime[10000]={0}; int i,j; int n; scanf("%d",&n); prime[0]=prime[1]=1; for(i=2;i<n;i++) if(prime[i]==0) for(j=2;i*j<=n;j++) prime[i*j]=1; for(i=0;i<n;i++) if(prime[i]==0) printf("%d\n",i); return 0; }
下面是另一种求素数方法,如果可以优化的话在下方留言哦~
#include<stdio.h> #include<math.h> void judge(int n); //----------------------------* int main(void){ int n,i; scanf("%d",&n); for(i=2;i<=n;i++) if(i%2!=0) //去偶数 judge(i); return 0; } //----------------------------* void judge(int n){ int i,flag=0; double sq; sq=sqrt(n); //减少开根运算 for( i=2;i<=sq;i++) //因数都是成对存在的 而且因数对一定是一大一小(除平方根) if(n%i==0){ flag=1; break; } if(flag==0) printf("%d\n",n); }
0.0分
79 人评分
各位大神为啥我这个不对呀,求指教 #include<iostream> using namespace std; int main(){ int n,flag=0; cin>>n; for(int j=2;j<n;j++){ for(int i=2;i<j;i++){ if(j%i==0){ flag=1; break; } if(flag==0) cout<<j<<endl; } } return 0; }
简简单单 #include <stdio.h> #include <math.h> int main(int argc,int const*argv[]) { int i,j,k,number; scanf("%d",&number); for(i=1;i<=number;i++) { k=(int)sqrt( (double)i ); for(j=2;j<=k;j++) { if(i%j==0) break; } if(j>=k+1&& i!=1 ) printf("%d\n",i); } return 0; }
//输入m,找出0——m间的质数 //方法一,遍历查找 //这个较你的第二种算法可能更优化 #include<stdio.h> #include<math.h> int main () { int m; int num,e; e=0; scanf("%d",&m); for(int j=2;j<=m;j++) { num=j; for(int i=1;i<=sqrt(num);i++) { if(num%i==0) e++; } if(e==1) printf("%d\n",num); e=0; } return 0; }
#include<stdio.h> void main() { int i,j,a; scanf("%d",&a); for(i=2;i<=a;i++) { for(j=2;;j++) { if(i%j==0){break;} if(j==i-1){printf("%d\n",i);break;} } } } 为什么我这个显示答案错误
啦啦啦 2021-01-28 12:31:25 |
#include <stdio.h> #include <math.h> int main() { int q, q1, i; scanf("%d", &q1); for(int q = 2; q <= q1; q++){ for(i = 2; i < sqrt(q); i++) { if(q % i == 0)break; } if(i > sqrt(q) || q == 2 || q == 3)printf("%d ",q); } return 0; }这样就可以
大神我想问一下为什么我这个不行吗?求解答 #include<stdio.h> ss(int i) { int j; for(j=2;j<i;j++) { if(i%j==0) return 0; } } main() { int i,n,j,k; scanf("%d",&n); if(n!=1&&n!=0) { for(i=2;i<=n;i++) { if(ss(i)) printf("%d\n",i); } } }
请问一下为什么我这个方法不行呢 #include <stdio.h> int main() { int n,i; scanf("%d",&n); for(i=0;i<n;i++) { if(i==0 || i==1) { continue; } if(i==2 || i==3 || i==5 || i==7) { printf("%d\n",i); } if(i%2!=0 && i%3!=0 && i%5!=0 && i%7!=0) { printf("%d\n",i); } } return 0; }
张程序员 2020-09-08 10:35:38 |
你找到错误原因了吗 我也是这样写的
第一种方法其实有一点错误, 当n为3时,素数输出只有2。
D164805414 2020-02-18 21:48:36 |
输出的时候改成小于等于n就行了,应该是手误而已
简单的a+b (C语言代码)浏览:827 |
【绝对值排序】 (C++代码)浏览:720 |
printf基础练习2 (C语言代码)浏览:955 |
C语言程序设计教程(第三版)课后习题6.7 (C语言代码)浏览:548 |
C语言训练-求1+2!+3!+...+N!的和 (C语言代码)浏览:822 |
WU-输出九九乘法表 (C++代码)浏览:1853 |
三角形 (C语言代码)浏览:965 |
C语言训练-数字母 (C语言代码)浏览:648 |
K-进制数 (C语言描述,蓝桥杯)浏览:955 |
1014题解浏览:524 |
耿 2021-03-25 17:25:44 |
#include<iostream> using namespace std; int main(){ int n,flag=0; cin>>n; for(int j=2;j<n;j++){ for(int i=2;i<j;i++){ if(j%i==0){ flag=1; break; }else{flag=0; } } if(flag==0) cout<<j<<endl; } return 0; }修改你的代码后的样子自己看吧
耿 2021-03-25 17:28:54 |
你的if(flag==0)这个模块放错位置了,还有啥情况下flag等于0也没写出来
邓明昊 2021-04-05 20:42:26 |
知道了,感谢感谢