POJ2739--Sum of Consecutive Prime Numbers(尺取法)
2015-08-16 15:37
387 查看
题目大意:给出一个数字,求共有多少个序列,使得序列和等于这个数字,序列是由连续的素数组成
分析:尺取法。先打个素数表。然后,就直接可以尺取法啦~
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
int n, ans;
int a[10002], vis[13000];
void prime() {
int cnt = 0;
memset(vis, 0, sizeof(vis));
for(int i = 2; i <= 12000; i++) {
if(!vis[i]) {
a[cnt++] = i;
for(int j = 2*i; j <= 12000; j += i) vis[j] = 1;
}
}
return;
}
int main()
{
prime();
while(scanf("%d", &n) != EOF && n != 0) {
int s = 0, t = 0;
int sum = 0;
ans = 0;
while(true) {
while(a[t] <= n && sum < n) {
sum += a[t++];
}
if(sum == n) ans++;
sum -= a[s++];
if(s == t) t++;
if(a[s] > n) break;
}
printf("%d\n", ans);
}
return 0;
}
分析:尺取法。先打个素数表。然后,就直接可以尺取法啦~
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
int n, ans;
int a[10002], vis[13000];
void prime() {
int cnt = 0;
memset(vis, 0, sizeof(vis));
for(int i = 2; i <= 12000; i++) {
if(!vis[i]) {
a[cnt++] = i;
for(int j = 2*i; j <= 12000; j += i) vis[j] = 1;
}
}
return;
}
int main()
{
prime();
while(scanf("%d", &n) != EOF && n != 0) {
int s = 0, t = 0;
int sum = 0;
ans = 0;
while(true) {
while(a[t] <= n && sum < n) {
sum += a[t++];
}
if(sum == n) ans++;
sum -= a[s++];
if(s == t) t++;
if(a[s] > n) break;
}
printf("%d\n", ans);
}
return 0;
}
相关文章推荐
- (4.1.34)Android侧滑菜单DrawerLayout的使用
- 转载自--ComponentOne技术服务--不得不爱开源 Wijmo jQuery 插件集
- 启动MFC程序的时候报错:0xC0000005: 读取位置 0x00000000 时发生访问冲突
- 断其一指------Handler消息传递机制
- #笔记#圣思园 JavaWeb 第78讲——JSON库,异步调用
- c++ 类中重写赋值操作符遇到的问题
- (转)为什么宏INT_MIN要写成-2147483647-1
- 机房收费系统之组合查询
- Rails+nginx服务器部署
- poj 2828 块状链表 OR 线段树 OR 树状数组
- 有时候
- LVS Nginx HAProxy 优缺点
- 玩儿转Swift——学习笔记(持续更新)
- https原理
- Solr 5.2.1 与mysql 整合
- 【机房收费系统】——结账
- Android 使用Fragment,ViewPagerIndicator 制作csdn app主要框架
- HDU 1166 敌兵布阵 // 线段树
- 【细说PHP学习】第十四章 PHP的日期和时间
- Team Queue(STL练习题)