HDOJ 1319 Prime Cuts<数论>
学会了不难。通过这道题学习了两点:
1:筛选法求素数。
2:在写比较长的程序的时候,给每个功能部分加上注释,思路会更清晰。
题意:
1.题目中所说的素数并不是真正的素数,包括1;
2.需要读懂题意,对于输入的n和c,如果1到n之间有偶数个素数则打印2c个数,奇数个素数则打印2c-1个数;
3.打印的数是所有素数中位于中间位置的那些数。
4.虽然数据量n<100.但是应确定第100+个素数是那个数,稍微把数组开大一些。
#include<iostream> #include<cstdio> #include<cmath> using namespace std; const int maxn=1050; bool isprime[maxn]; int prime[200]; //筛选法求素数 void Erato() { isprime[0]=false; isprime[1]=true; isprime[2]=true; //初始化 for(int i=3;i<maxn;i++){ isprime[i++]=true;//奇数 isprime[i]=false;//偶数 } //判断素数 int n=sqrt(maxn); for(int i=3;i<=n;i+=2) for(int j=i+i;j<maxn;j+=i) isprime[j]=false; //将素数方如prime中,包括1 prime[0]=1; prime[1]=2; int j=2; for(int i=3;i<maxn;i+=2) if(isprime[i]) prime[j++]=i; } int main () { Erato(); int n,c,count; int printcount,str,end; while(~scanf("%d%d",&n,&c)) { printf("%d %d:", n, c); count=0; int i=0; //统计素数的个数 while(prime[i++]<=n) count++; //统计要打印素数的个数 if(count%2) printcount=2*c-1; else printcount=2*c; // 计算数据的起始与终止位置 if(printcount>=count) str=0,end=count-1; else{ str=(count-printcount)/2; end=str+printcount-1; } for(int i=str;i<=end;i++) printf(" %d",prime[i]); printf("\n\n"); } return 0; }
想的太多,做的太少。