如果筛选素数sqrt(n),然后挨个统计进去,复杂度是nsqrt(n)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h> #include<math.h> #include<string.h> using namespace std; bool isPrime(int n) { if(n<=1) return false; int temp=(int)sqrt(n); for(int i=2;i<=temp;i++) if(n%i==0) return false; return true; } int prime[105];//存prime的具体数值 int pNum=0; bool p[105]={0};//存每个位置是不是素数,按实际下标没有偏移量 void findprime(int n) { for(int i=1;i<=n;i++) if(isPrime(i)) { prime[pNum++]=i; p[i]=1; } } int main() { findprime(100); for(int i=0;i<pNum;i++) printf("%d ",prime[i]); return 0; }
可以使用素数筛,这时候要注意 bool p[105]={0}是可以的,都赋值成1是不可以的哦!
因为是在判定中标记非素数,所以只能是素数0非素数1这样设定了。
另外记得内循环是从2*i开始的,不是i
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h> #include<math.h> #include<string.h> using namespace std; int prime[105];//存prime的具体数值 int pNum=0; bool p[105]={0};//存每个位置是不是素数,按实际下标没有偏移量 void findprime(int n) { p[0]=1; p[1]=1; p[2]=0; for(int i=2;i<=n;i++) { for(int j=i+i;j<=n;j=j+i) p[j]=1; } for(int i=2;i<=n;i++) { if(p[i]==0) prime[pNum++]=i; } } int main() { findprime(100); for(int i=0;i<pNum;i++) printf("%d ",prime[i]); return 0; }
注意!!!素数筛里面2一定要筛!不是2规定了素数就完事儿了!不然4这种筛不掉(其实规定2素数那一步很没必要)
求多个或者范围内用打表,打表一个函数就够了。求某一个是不是素数用sqrt那个
PAT B1013找素数
里面是prime[x-1]代表的第x个数哦
刚开始写错了,赶上素数筛写的也有点问题。。居然把样例过去了,题很简单
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h> #include<math.h> #include<string.h> using namespace std; int prime[120000];//存prime的具体数值 int pNum=0; bool p[120000]={0};//存每个位置是不是素数,按实际下标没有偏移量 int n,m; void findprime(int n) { p[0]=1; p[1]=1; p[2]=0; for(int i=2;i<=n;i++) { for(int j=i+i;j<=n;j=j+i) p[j]=1; } for(int i=2;i<=n;i++) { if(p[i]==0) prime[pNum++]=i; } } int main() { scanf("%d %d",&m,&n); findprime(110000); for(int i=m;i<=n;i++) if((i+1-m)%10 &&i!=n) printf("%d ",prime[i-1]); else /*if((i+1-m)%10==0)*/ printf("%d ",prime[i-1]); /*else printf("%d",prime[i-1]);*/ return 0; }#include<stdio.h> #include<math.h> #include<string.h> using namespace std; int prime[120000];//存prime的具体数值 int pNum=0; bool p[120000]={0};//存每个位置是不是素数,按实际下标没有偏移量 int n,m; void findprime(int n) { p[0]=1; p[1]=1; p[2]=0; for(int i=2;i<=n;i++) { for(int j=i+i;j<=n;j=j+i) p[j]=1; } for(int i=2;i<=n;i++) { if(p[i]==0) prime[pNum++]=i; } } int main() { scanf("%d %d",&m,&n); findprime(110000); for(int i=m;i<=n;i++) if((i+1-m)%10 &&i!=n) printf("%d ",prime[i-1]); else /*if((i+1-m)%10==0)*/ printf("%d ",prime[i-1]); /*else printf("%d",prime[i-1]);*/ return 0; }
PAT A1059分解质因数
质因数不会大于10,因为最小的10个质数相乘就爆炸int
另外大于sqrt的最多只有一个,节约时间。最开始开质数表开到1e5足够大了,如果开成n有时候太浪费了
因为n在不断被除,这时候要有变量存住,不然sqrtn和n都在变化
在小于sqrt的质数中遍历,除到不能再整除为止。
在处理大于sqrt的时候,如果有就是剩下的n本身,数量为1。
注意因为使用了结构体,不要在修fac.x和fac.cnt的时候重复修改count
最后一个没有乘号,大于1个的因子用^
1的时候需要特判输出1=1
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h> #include<string.h> #include<math.h> using namespace std; int prime[100005]; int pNum=0; bool p[100005]={0};//0为素数 void findprime(int n) { p[0]=1; p[1]=1; for(int i=2;i<=n;i++) { if(p[i]==0) prime[pNum++]=i; for(int j=i+i;j<=n;j=j+i) p[j]=1; } } struct factor { int x,cnt=0; }fac[10]; int main() { int n; scanf("%d",&n); if(n==1) { printf("1=1"); return 0; } findprime(100000); int count=0; int temp=sqrt(n); int tempn=n; for(int i=0;i<pNum;i++) { if(prime[i]>temp) break; if(n%prime[i]==0) { //printf("hah%d ",prime[i]); fac[count].x=prime[i]; fac[count].cnt++; n=n/prime[i]; while(n%prime[i]==0) { fac[count].cnt++; n=n/prime[i]; } count++; //printf("%d %d ",fac[count-1].x,fac[count-1].cnt); } } if(n!=1) { fac[count].x=n; fac[count++].cnt=1; } printf("%d=",tempn); for(int i=0;i<=count-1;i++) { if(fac[i].cnt>1) { printf("%d^%d",fac[i].x,fac[i].cnt); } else { printf("%d",fac[i].x); } if(i!=count-1) printf("*"); } return 0; }