我必须打印,你可以代表一个给定的数字,因为它是素数的部分方式的数量。
让我澄清一下:比方说,我一直在考虑这个号码7。现在,首先,我必须找到所有的质数小于7,这是2,3和5。现在,在多少个方式我总结这些数字(我可以使用同一个号码多次我想),这样的结果等于7? 例如,7号有五个方面:
2 + 2 + 3
2 + 3 + 2
2 + 5
3 + 2 + 2
5 + 2
我完全失去了与这个任务。 首先我想我使可用元素的数组像这样:{2,2,2,3,3,5}(7/2 = 3,所以2必须出现三次同去与3,其增加了两个出现次数)。 在此之后,遍历数组,选择“领导者”,确定我们有多远在数组中。 我知道这个解释是可怕的,所以这里的代码:
#include <iostream>
#include <vector>
int primes_all[25] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97};
int main()
{
int number;
std::cin >> number;
std::vector<int> primes_used;
for(int i = 0; i < 25; i++) {
if(primes_all[i] < number && number-primes_all[i] > 1) {
for(int k = 0; k < number/primes_all[i]; k++)
primes_used.push_back(primes_all[i]);
}
else break;
}
int result = 0;
for(size_t i = 0; i < primes_used.size(); i++) {
int j = primes_used.size()-1;
int new_num = number - primes_used[i];
while(new_num > 1 && j > -1)
{
if(j > -1) while(primes_used[j] > new_num && j > 0) j--;
if(j != i && j > -1) {
new_num -= primes_used[j];
std::cout << primes_used[i] << " " << primes_used[j] << " " << new_num << std::endl;
}
j--;
}
if(new_num == 0) result++;
}
std::cout << result << std::endl;
system("pause");
return 0;
}
这根本不起作用。 很简单,因为它背后的想法是错误的。 以下是关于限制的小细节:
- 时间限制:1秒
- 内存限制:128 MB
此外,可以给出的最大数量是100这就是为什么我做了素数的阵列下方100结果的生长速度非常快,给定的数量越大,并稍后需要一个BigInteger类,但是这不是一个问题。
一些结果可知:
Input Result
7 5
20 732
80 10343662267187
SO ...任何想法? 这是一个组合子问题吗? 我不需要的代码,只是一个想法。 我还是个新手,C ++,但我会管理
请记住,3 + 2 + 2比2 + 3 + 2也不同,分别为定数是素本身,它不会被计算在内。 例如,如果给定的数字是7,只有这些款项是有效的:
2 + 2 + 3
2 + 3 + 2
2 + 5
3 + 2 + 2
5 + 2
7 <= excluded