UVa 406 - Prime Cuts

来源:互联网 发布:centos 7.3 lnmp 编辑:程序博客网 时间:2024/04/27 07:09

题目:给你2个数n,C,确定,不超过n的素数的中间的一个范围。 定义[1,n]上有k个素数。

            则k为奇数,输出中间的2*k-1个;k为偶数,输出中间的2*k个。

分析:数论。直接打表计算所有的0-1000的素数,然后求中线向两边找端点即可。

说明:在本题中1是素数。

#include <iostream>#include <cstdlib>#include <cstring>#include <cstdio>using namespace std;int used[1001];int prim[1001];int main(){memset( used, 0, sizeof(used) );int count = 0;prim[count ++] = 1;for ( int i = 2 ; i <= 1000 ; ++ i )if ( !used[i] ) {prim[count ++] = i;for ( int j = i<<1 ; j <= 1000 ; j += i )used[j] = 1;}prim[count] = 1001;    int n,m;    while ( ~scanf("%d%d",&n,&m) ) {printf("%d %d:",n,m);int r = 0;while ( prim[r+1] <= n ) r ++;int mid = r/2;int l = mid;r = mid+(r%2);while ( -- m ) {l --; r ++;if ( l < 0 ) l ++;if ( prim[r] > n ) r --;}while ( l <= r )printf(" %d",prim[l ++]);printf("\n\n");    }    return 0;}


0 0