質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

441閲覧

x=a^3+b^3を満たす異なる2つのa,bの組を探す

vain_taka

総合スコア14

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/05/07 04:48

/* x=a^3+b^3を満たす異なる2つのa,bの組を持つxを探す */ #include <stdio.h> int main(void) { int x, a1, b1, y, a2, b2; for(x = 1; x <= 10000; x++) { for(a1 = 1; a1 <= 22; a1++) { for(b1 = 1; b1<= 22; b1++) { for(y = 1;y <= 10000; y++) { for(a2 = 1; a2 <= 22; a2++) { for(b2 = 1; b2 <= 22; b2++) { x = a1*a1*a1 + b1*b1*b1; y = a2*a2*a2 + b2*b2*b2; if(x == y && a1 != a2 && b1 != b2) printf("%d\n",x); } } } } } } return 0; }

1<=x<=10000の整数xについて、x=a^3+b^3を満たす異なる整数a,bの組を2つ持つxを表示するプログラムを作ろうとしています。
例えば、1729=1^3+12^3=9^3+10^3のように異なる2つのa,bの組を持つxを探します。
じぶんの考えとしては、x=aaa+bbb, y=ccc+dddと置いて、xとyが等しく、aとcが異なり、bとdが異なる時にそのxを表示するようにしたのですが、うまくいきません。a~dの繰り返しが22までなのは3乗して10000を超えないのが22までだからです。どのように修正すればうまくできるでしょうか。言語はCです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

元のループでは、ループ内でxyを書き換えてしまっているため、うまくループしません。というより、計算結果しか入れないのであればxyでループさせる意味が全くありません。

そして、効率のことを考えれば、

  1. まず1~22までの3乗にした値の表を作っておいて、それを2つ組み合わせる形で計算する
  2. そして、a^3 + b^3 = c^3 + d^3となる以上、a < c ≦ d < bに限定して探せばいい

というような絞り込みをやれば、探索範囲はぐっと狭くなります。

投稿2018/05/07 04:58

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2018/05/07 05:37

なお、試しに計算させてみたところ、条件を満たすのは1729と4104だけのようです。
vain_taka

2018/05/07 12:34

なるほど、xとyを使う必要はなかったんですね。 a<c<=b<dにするという発想は浮かびませんでした。非常に参考になります。
guest

0

アルゴリズムをすべて検証したわけではありませんが、forループにxとyを使ったものがあるのに、

x = a1*a1*a1 + b1*b1*b1; y = a2*a2*a2 + b2*b2*b2;

としてループ内の処理で値を変えてしまうと、うまくループが回らなくなるのではないですか?
xとyは計算で求める値なので、ループ変数にする必要はないと思います。

投稿2018/05/07 04:54

m-take

総合スコア249

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

こんにちは、maisumakunさんがおっしゃるとおり

a^3 + b^3 = c^3 + d^3となる以上、a < c ≦ d < bに限定して探せばいい

ので、for文でループする際a,b,c,dのループするスタート地点は

それぞれa = 1, c = a + 1,d = c, b = d + 1とすればいいでしょう。

こうすることで、必然的にa != c , b != dとなります。

ゴール地点ですが基本的に3乗の値が10000未満までという条件式を立てれればいいでしょう。
ただ、効率化を図るためにb < 10000 - (現在のaの3乗)とすれば処理速度は速くなります。dも同様です。
私は、3乗を求めるところを関数にしていますが、関数にしなくてもいいです。

C

1#include <stdio.h> 2 3#define MAX_NUMBER 10000 4 5int Cubed(int); 6 7int main(void){ 8 9 int a,b,c,d; 10 int sum1,sum2; 11 for(a = 1; Cubed(a) < MAX_NUMBER; a++){ 12 for(c = a + 1; Cubed(c) < MAX_NUMBER; c++){ 13 for(d = c; Cubed(d) < MAX_NUMBER - Cubed(c) ; d++){ 14 for(b = d + 1; Cubed(b) < MAX_NUMBER - Cubed(a); b++){ 15 sum1 = Cubed(a) + Cubed(b); 16 sum2 = Cubed(c) + Cubed(d); 17 if(sum1 == sum2){ 18 printf("%d ^ 3 + %d ^ 3 = %d ^ 3 + %d ^ 3 = %d\n",a,b,c,d,sum1); 19 } 20 } 21 } 22 } 23 } 24 return 0; 25} 26 27int Cubed(int a){ 28 return a * a * a; 29}

<実行結果>
1 ^ 3 + 12 ^ 3 = 9 ^ 3 + 10 ^ 3 = 1729
2 ^ 3 + 16 ^ 3 = 9 ^ 3 + 15 ^ 3 = 4104

投稿2018/05/07 06:14

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

vain_taka

2018/05/07 12:38

maisumakunさんおっしゃったことをさらに詳しく説明していただきとてもわかりやすかったです。効率化のくだりは参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問