• ベストアンサー

ゴールドバッハの予想のプログラム

学校の課題で1000まで『ゴールドバッハの予想』を表示させないと行けないのですが全くわかりません… フローチャートだけでもわかる方おられませんか? ぜひ教えてください!!

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

1.素数の一覧表を作る   1)1000個の整数の配列を作る   2)0で初期化   3)2番目、4番目……と2の倍数毎に '1' をセットする     これで、偶数にマークを付けることができた。   4)3番目、6番目……と3の倍数毎に、'1' をセットする     これで、3の倍数にマークを付けることができた。   5)以下、4の倍数、5の倍数~32の倍数までマークを付ける   以上で、マークのついてないものが、素数 2.和を求める数をnとする。   1)n未満で素数であることがわかっている数字をひとつ選び出す     1.で求めた素数リストを使う   2)その数字をaとする   3)n-a が素数かどうか調べる     ・n-aが素数なら、n=a+(n-a)に分解できた。     ・n-aが素数でないなら、次のaを選び直す No.1 の回答にあるのと同じ流れですが。 それと、素数リストを作るあたりは、「なぜ32までなのか」がポイントです。さらに、かなり無駄な処理が混ざっています。

その他の回答 (2)

回答No.3

No.2 訂正です。 1.素数の一覧表を作る   1)1000個の整数の配列を作る   2)0で初期化   3)4番目、6番目……と2の倍数毎に '1' をセットする     (2番目=2は素数なので、ここにはマークを付けない)     これで、偶数にマークを付けることができた。   4)6番目、9番目……と3の倍数毎に、'1' をセットする     (3番目=3は素数なので、ここにはマークを付けない)     これで、3の倍数にマークを付けることができた。   5)以下、4の倍数、5の倍数~32の倍数までマークを付ける ですね。

回答No.1

#include <vector> #include <iostream> //思いっきり非効率だけどこんな感じかなあ。 //最初配列でやろうと思ったけど,自動的に要素数が増えないから管理が面倒そうだった。 // 比較的慣れているC#やVB.NETでやらなかったのはGeneric Listにprimitive type持たせたときのboxingの痛い思い出があるから。 //フローチャートかけないのでソースコードを勉強して読み解いてくれということで。 //言語の指定がなかったのでC++のつもり。コンパイラは //Thread model: win32 gcc version 3.4.5 (mingw special) std::vector<int> getPrimeNumbers(int n){ std::vector<int> v; bool isprime; v.push_back(2); int i; int j; for (i = 3; i <= n; i++){ isprime = true; for (j = 2; j <= i - 1 ;j++){ if ( i % j == 0){ isprime = false; } } if (isprime == true){ v.push_back(i); } } return v; } int main(){ for (int n = 6; n <= 1000; n = n + 2){ std::vector<int> v = getPrimeNumbers(n); bool found = false; for (std::vector<int>::iterator Iter = v.begin(); Iter != v.end(); Iter++){ for (std::vector<int>::iterator Iter2 = v.begin(); ((Iter2 != v.end()) && (found == false)); Iter2++){ if ( (*Iter2) == ( n - (*Iter))){ found = true; std::cout << n << " = " << (*Iter) << " + " << (*Iter2) << std::endl; } } } if (found == false){ std::cout << n << " = " << "failed" << std::endl; } } }

inokimax
質問者

お礼

回答ありがとうございます!! プログラムの言語はFORTRANでした。 この回答への補足に書いていたので、遅くなって済みません…

inokimax
質問者

補足

プログラムの言語はFORTRANです!! 遅くなって済みません…