• 締切済み

素数のみの足し算

よろしくお願いします。 只今、Javaで4~100までの間の偶数のみを素数を足して表現するというプログラムを書いています。 具体的には、 4=2+2 6=3+3 8=3+5 10=5+5 という感じで100まで表示させたいと思っています。 IF文とfor文のみで書きたいと思っています。 どうかよろしくお願いします。

みんなの回答

回答No.3

/*===========PrimesPair.java===============*/ class PrimesPair{ /* VB.NET用に作ったものを手作業でJavaに脳内変換した。 バグがあるかも。 Redim Preserve相当句を調べるのが面倒くさいので、配列は不要なまでにたっぷり確保。 ただし、もちろん素数の数がこれを超えるようだとエラーが出ると思う。 */ private int[] Primes = new int[600]; private int Current; private int N; public PrimesPair() { N = 100; } public PrimesPair(int max){ N = max; } public void ListOfPrimesInitialize(){ boolean IsPrime = true; Current = 0; Primes[0] = 2; for(int i=3;i<=N;i++){ IsPrime = true; for(int j= 2;j<=i-1;j++){ if (i % j == 0){ IsPrime = false; break; } } if(IsPrime == true){ Primes[Current + 1] = i; Current = Current + 1; } } } public void SearchPair(){ int pseudoPairNumber = 0; int PairNumber = 0; boolean IsPair = false; for(int i = 4;i<=N;i=i+2){ /* i=i+2をi=i+1にすると、「4以上の偶数」でなく「4以上の自然数」になる。 このときの出力についても考えたので和が11となる二つの自然数が存在しないことがわかる */ pseudoPairNumber = 0; PairNumber = 0; IsPair = false; for(int j = 0;j<=Current;j++){ pseudoPairNumber = i - Primes[j]; for(int k = 0;k<=Current;k++){ if(pseudoPairNumber == Primes[k]){ PairNumber = pseudoPairNumber; IsPair = true; break; } } if(IsPair == true){ System.out.println(Integer.toString(i) + " = " + Integer.toString(Primes[j]) + " + " + Integer.toString(PairNumber)); break; } } if(IsPair == false){ System.out.println("和が" + Integer.toString(i) + "となる二つの素数は存在しない"); } } } } /*===========PrimesMain.java===============*/ class PrimesMain{ public static void main(String[] args){ PrimesPair primes; if (args.length > 0){ primes = new PrimesPair(Integer.parseInt(args[0])); }else { primes = new PrimesPair(); } primes.ListOfPrimesInitialize(); primes.SearchPair(); } } ============================= C:\Data\Administrator\Oshiete_Goo\Q3020004\JavaPrimes>javac PrimesPair.java C:\Data\Administrator\Oshiete_Goo\Q3020004\JavaPrimes>javac PrimesMain.java C:\Data\Administrator\Oshiete_Goo\Q3020004\JavaPrimes>java PrimesMain 100 4 = 2 + 2 6 = 3 + 3 8 = 3 + 5 10 = 3 + 7 12 = 5 + 7 14 = 3 + 11 16 = 3 + 13 18 = 5 + 13 20 = 3 + 17 22 = 3 + 19 24 = 5 + 19 26 = 3 + 23 28 = 5 + 23 30 = 7 + 23 32 = 3 + 29 34 = 3 + 31 36 = 5 + 31 38 = 7 + 31 40 = 3 + 37 42 = 5 + 37 44 = 3 + 41 46 = 3 + 43 48 = 5 + 43 50 = 3 + 47 52 = 5 + 47 54 = 7 + 47 56 = 3 + 53 58 = 5 + 53 60 = 7 + 53 62 = 3 + 59 64 = 3 + 61 66 = 5 + 61 68 = 7 + 61 70 = 3 + 67 72 = 5 + 67 74 = 3 + 71 76 = 3 + 73 78 = 5 + 73 80 = 7 + 73 82 = 3 + 79 84 = 5 + 79 86 = 3 + 83 88 = 5 + 83 90 = 7 + 83 92 = 3 + 89 94 = 5 + 89 96 = 7 + 89 98 = 19 + 79 100 = 3 + 97 ========================== たぶんなんかどっかにバグあるでしょうし、今後識者によるより良いソースが出ると思ってます。 考えるのが面倒くさかったので素数最初に全部求めてストックしちゃいました。

mismoon
質問者

お礼

ありがとうございました。 参考にさせていただきました。

  • PED02744
  • ベストアンサー率40% (157/390)
回答No.2

>どうかよろしくお願いします なにを、よろしくお願いなのでしょう? 1から全部作って欲しいということでしょうか? 「ここまで作ったが動かないので教えて」程度までできてないと、 まともな回答は付かないんじゃないでしょうか。

回答No.1

質問を考える前に補足要求させてもらうよ 素数だけの足し算って話なら 6 = 2 + 2 + 2 とか 10 = 7 + 3 ってのも立派に成立するんだけど、それらはどうするの?

mismoon
質問者

お礼

いろいろと至らない点がありすいませんでした。 今後は、気をつけていきたいと思います。 ありがとうございました。

mismoon
質問者

補足

すいませんでした。 これはゴールドバッハの予想(4以上の任意の偶数は、二つの素数の和で表すことができる )という定義にそって作るプログラムです。 なお、一つの偶数に二つの答えがでてきてしまう場合もありますが、どちらか一方のみの足し算で大丈夫です。 10を例にするなら、5+5 , 3+7のどちららか一方のみで大丈夫です。