北邮ACM2017热身赛-D题 发表于 2017-04-04 | 分类于 ACM | 浏览 次 字数统计: 242 | 阅读时长 ≈ 1 题目 分析给定一个整数,将它分解成连续素数的和,求这样的分解方法数 思路先利用素数筛打出素数表 然后 代码#include <iostream>#include<stdio.h>#include<stdlib.h>#include<string>#include <vector>using namespace std;vector<int> primes;bool is_prime[1000006];//建立素数表和存储素数的vectorvoid init_primes(){ memset(is_prime,true, 1000005); is_prime[0] = is_prime[1] = false; for (int i = 2; i <= 1000005; ++i){ if (is_prime[i]){ primes.push_back(i); for (int j = 2; j*i <= 1000005; j++){ is_prime[i*j] = false; } } }} int main(){ vector<int> output; init_primes(); int primesnum = primes.size(); int n; while (cin >> n){ //i是分解形式的首个素数,j是最后一个素数 int i = 0, j = 0, sum = 0, result = 0; while(true){ while (sum < n && j < primesnum){ sum += primes[j++]; } //加到最后一个素数了,和还是小于n,说明后面没有满足条件的分解方式了,跳出循环结束运算 if (sum < n){ break; } else if (sum == n){ ++result; } //i向后移 sum -= primes[i++]; } output.push_back(result); } for (int i = 0; i < output.size(); i++) { cout << output[i] << endl; } //system("pause"); return 0;}