您的位置:首页 > 其它

UVa 406 - Prime Cuts

2014-06-23 02:36 375 查看
题目:给你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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: