与えられた数を素数の部分として表現できる方法の数を出力する必要があります。
明確にさせてください: 仮に私がこの数 7 を与えられたとしましょう. さて, まず第一に, 7 より小さい素数をすべて見つけなければなりません. 2, 3, 5 です.これらの数字を要約して (1 つの数字を何度でも使用できます)、結果が 7 になるようにしますか? たとえば、番号 7 には 5 つの方法があります。
2 + 2 + 3
2 + 3 + 2
2 + 5
3 + 2 + 2
5 + 2
私はこの仕事で完全に迷っています。最初に、使用可能な要素の配列を次のように作成することを考えました: { 2, 2, 2, 3, 3, 5 } (7/2 = 3 なので、2 は 3 回出現する必要があります。3 も同様で、2 になります。発生)。その後、配列をループして、配列内の距離を決定する「リーダー」を選択します。説明がひどいことはわかっているので、コードは次のとおりです。
#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
そう...何かアイデアはありますか?これは組み合わせの問題ですか?コードは必要ありません。単なるアイデアです。私はまだC++の初心者ですが、管理します
3 + 2 + 2 は 2 + 3 + 2 とは異なることに注意してください。また、指定された数自体が素数である場合はカウントされません。たとえば、指定された数値が 7 の場合、次の合計のみが有効です。
2 + 2 + 3
2 + 3 + 2
2 + 5
3 + 2 + 2
5 + 2
7 <= excluded