您的位置:首页 > 其它

HDU1319 Prime Cuts

2016-05-08 18:11 274 查看
问题链接: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: