1≦a≦100および1≦b≦100をそれぞれ満たす2つの自然数a,bについて、a²+b²=c²を満たす自然数a,b,cの組み合わせを列挙するプログラムを作成しなさい。なお、列挙される組み合わせの順番については、以下の通りでなくてもよい。(注意:以下の実行例では、3²を表すのに3^2としているが、これは表示を行う際の便宣上のものであり、C言語ではべき乗の演算子は存在しない事に注意すること。)
[実行例]
3^2+4^2=5^2
4^2+3^2=5^2
5^2+12^2=13^2
・・・中略・・・
100^2+75^2=125^2
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/29 22:59
回答5件
0
参考情報
- ピタゴラス数
http://www.mathlion.jp/article/ar135.html
- 1万以下のピタゴラス数一覧表
https://www.hyogo-c.ed.jp/~meihoku-hs/club/astronomy-py.html
- ピタゴラス数の求め方とその証明
https://mathtrain.jp/pythagoras
- ピタゴラス数列挙プログラム
http://www008.upp.so-net.ne.jp/kinoko/rimokon/11ch/pythagoras.htm
上の参考情報の一番目のページに記載されている方法で
原始ピタゴラス数とその定数倍の数を列挙していくようなプログラム
を書いてみました。
(c, c++ でなく、ruby で書いてますが)
r.rb
ruby
1# frozen_string_literal: true 2 3ans = [] 4(1..100).each do |m| 5 (1...m).each do |n| 6 next if m.gcd(n) != 1 # m, n は互いに素 7 next if (m - n).even? # m − n が奇数 8 9 a = m * m - n * n 10 b = 2 * m * n 11 next if a > 100 || b > 100 12 13 c = m * m + n * n 14 big = [a, b].max 15 (1..(100 + big - 1) / big).each do |t| 16 next if a * t > 100 || b * t > 100 17 18 at = a * t 19 bt = b * t 20 ct = c * t 21 ans += [[at, bt, ct], [bt, at, ct]] 22 end 23 end 24end 25 26p "#{ans.size} 通りあります。" 27ans.each do |v| 28 puts("#{v[0]}^2 + #{v[1]}^2 = #{v[2]}^2") 29end
投稿2020/12/01 12:08
総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
この程度なら、二分探索でなく線形探索で十分でしょう。
C
1#include <stdio.h> 2 3int main(void) 4{ 5 int s[150], a, b, c, cc; 6 for (c = 0; c < 150; c++) s[c] = c * c; 7 for (a = 1; a <= 100; a++) 8 for (b = 1; b <= 100; b++) 9 for (cc = a*a + b*b, c = 1; s[c] <= cc; c++) 10 if (s[c] == cc) printf("%4d%4d%4d\n", a, b, c); 11}
投稿2020/11/30 13:39
総合スコア8224
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
一番外側のループを c についてのループとしたが,いまいち感.
C++
1inline void Show( int a, int b, int c ) 2{ std::cout << a << "^2 + " << b << "^2 = " << c << "^2\n"; } 3 4int main(void) 5{ 6 const unsigned int N = 100; //※a,bの最大値 7 unsigned int Sq[N+1]; 8 for( unsigned int i=1; i<=N; ++i ){ Sq[i] = i*i; } 9 10 unsigned int c=2; 11 while( true ) 12 { 13 const unsigned int SqC = ( c<=N ? Sq[c] : c*c ); //※不格好だなぁ 14 if( SqC > 2*N*N )break; 15 16 for( unsigned int a=1; a<=std::min(c-1,N); ++a ) 17 { 18 const unsigned int SqRest = SqC - Sq[a]; 19 20 unsigned int l=1, h=a; 21 while( l<=h ) 22 { 23 unsigned int b = (l+h)/2; 24 if( Sq[b] == SqRest ){ Show( a,b,c ); Show( b,a,c ); break; } 25 26 if( Sq[b] < SqRest ){ l = b+1; } 27 else { h = b-1; } 28 } 29 } 30 31 ++c; 32 } 33 34 return 0; 35}
投稿2020/11/30 02:43
編集2020/11/30 10:23総合スコア11990
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
出力のフォーマットは自分でいじってください
これで目的の値は得られるはずですよ!
c++
1#include <bits/stdc++.h> 2using namespace std; 3 4int main() { 5 for(int a=1; a<=100; a++) { 6 for(int b=1; b<=100; b++) { 7 int x = pow(a, 2) + pow(b, 2); 8 int y = sqrt(x); 9 if(x == y * y) { 10 cout << "a:" << a << " b:" << b << " c:" << y << endl; 11 } 12 } 13 } 14 return 0; 15}
投稿2020/11/30 00:16
総合スコア182
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。