我需要打印出如何将给定的数字表示为其质数部分的方式数量。
让我解释一下:假设我有数字7。首先,我需要找到所有小于7的质数,它们是2、3和5。现在,我可以用这些数字(我可以使用一个数字多次)以多少种方式总结这些数字,使得结果等于7?例如,数字7有五种方法:
这根本行不通。仅仅因为其背后的理念是错误的。以下是一些关于限制的细节:
以下是一些已知的结果:
让我解释一下:假设我有数字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
以下是一些已知的结果:
Input Result
7 5
20 732
80 10343662267187
那么... 有什么想法吗?这是一个组合问题吗?我不需要代码,只需要一个想法。虽然我还是C++的新手,但我会应对。
记住,3 + 2 + 2和2 + 3 + 2是不同的。 另外,如果给定的数字本身是质数,则不计算在内。例如,如果给定的数字是7,则只有以下这些总和是有效的:
2 + 2 + 3
2 + 3 + 2
2 + 5
3 + 2 + 2
5 + 2
7 <= excluded
3 + 2 + 2
和2 + 2 + 3
是否被视为不同的? - corsiKa3 + 2 + 2
!=2 + 3 + 2
!=2 + 2 + 3
。 - Olavi Mustanoja