标签:
问题链接:HDU1319
这是一个比较简单的问题。其关键是需要读懂题意,使用素数筛选法打表,然后进行输出即可。
需要注意的点如下:
1.题目中所说的素数并不是真正的素数,包括1;
2.需要读懂题意,对于输入的n和c,如果1到n之间有偶数个素数则打印2c个数,奇数个素数则打印2c-1个数;
3.打印的数是所有素数中位于中间位置的那些数。
事先还是要做一点功课的,计算一下1到1000之间有多少个素数,避免数组空间过大或过小。
另外,题目虽然说n<=100,但是,至少需要算一个比1000大的素数,以便统计小于n的素数的个数。
本程序逻辑清晰易懂,计算过程参见程序注释。
程序如下:
/* HDU1319 PKU1595 Prime Cuts */
#include <iostream>
#include <math.h>
using namespace std;
#define MAXN 1050
bool isprime[MAXN+1];
int prime[200];
// 修正的Eratosthenes筛选法,根据题意包含1(并非全是素数)
void sieveofe(bool isprime[], int prime[], int n)
{
int i, j;
isprime[0] = false;
isprime[1] = true;
isprime[2] = true;
// 初始化
for(i=3; i<=n; i++) {
isprime[i++] = true;
isprime[i] = false;
}
int max = sqrt(n);
for(i=3; i<=max; i++){
if(isprime[i]) {
for(j=i+i; j < n; j+=i) //进行筛选
isprime[j] = false;
}
}
// 将素数放数组prime中,包含1
prime[0] = 1;
prime[1] = 2;
j = 2;
for(i=3; i<=n; i+=2)
if(isprime[i])
prime[j++] = i;
}
int main()
{
// 筛选素数
sieveofe(isprime, prime, MAXN);
int n, c, count, i;
int printcount, start, end;
// 循环处理输入
while(~scanf("%d%d",&n,&c)) {
printf("%d %d:", n, c);
// 统计素数个数
count = 0;
i = 0;
while(prime[i++] <= n)
count++;
// 计算打印数据的个数
if(count % 2 == 0) {
printcount = 2 * c;
} else {
printcount = 2 * c -1;
}
// 计算数据的起始与终止位置
if(printcount >= count) {
start = 0;
end = count - 1;
} else {
start = (count - printcount) / 2;
end = start + printcount - 1;
}
// 打印结果
for(i=start; i<=end; i++)
printf(" %d", prime[i]);
printf("\n\n");
}
return 0;
}标签:
原文地址:http://blog.csdn.net/tigerisland45/article/details/51346831