ページ 1 / 1
初級プログラミング
Posted: 2008年7月29日(火) 20:13
by 初心者
入力はn(正の整数)で、n=a^2+b^2となるa,bが
存在するときはa,bの組を一つ、しないときはNoを出力するんですが、やり方がまったくわかりません。
どなたかお願いします。
環境はLinux,gccです。
Re:初級プログラミング
Posted: 2008年7月29日(火) 20:37
by box
a, bに関する制約はないのですか?
仮に制約がないとすると、与式を満たす(a, b)の組は
無限に存在します。
Re:初級プログラミング
Posted: 2008年7月29日(火) 20:45
by たいちう
小さなnに対して、手で解いてみてください。
例えば、n=5について(a, b) = (1, 2)が言えますが、n=6については、Noになります。
0 < n <= 10 位までの全ての n について、手で解いて見ましょう。
特にNoという出力のためには、いきあたりばったりの方法ではだめで、
適切な手順で試してみて、条件を満たす(a, b)がないことを示さないといけません。
適切な手順を発見できたら、プログラムの出番です。
まずは発見しましょう。
> a, bに関する制約はないのですか?
私の説明では、これを勝手に整数と制約しています。
Re:初級プログラミング
Posted: 2008年7月29日(火) 20:54
by tk-xleader
実数の範囲でなら無数に存在しますね。
整数の範囲ということであれば、難しくなります。(解けなかった…)
Re:初級プログラミング
Posted: 2008年7月29日(火) 21:33
by フリオ
>入力はn(正の整数)で、n=a^2+b^2となるa,b
"2乗の和"というのが、ヒントですね。
グラフで考えた方がわかりやすいかも。
Re:初級プログラミング
Posted: 2008年7月29日(火) 22:54
by たかぎ
確かにa, bがどんな値でもよいのかどうかを決めるのが先決です。
実数だけでなく、複素数まで考えるときりがありません。
Re:初級プログラミング
Posted: 2008年7月29日(火) 23:28
by 初心者
すいませんa,bには正の整数という制約がありました。
a=1のときk=n-a^2としてb=1,2...に対してk=b^2となるbが見つかったらa,bを記憶させて、
なかったらa=2,3......
とかいっろいろやってみたんですがやはりうまくいきません(^^;
>フリオさん
どういうことですか?
Re:初級プログラミング
Posted: 2008年7月29日(火) 23:41
by box
> とかいっろいろやってみたんですがやはりうまくいきません
いろいろやってみたときのコードを提示するお考えはありますか?
Re:初級プログラミング
Posted: 2008年7月29日(火) 23:51
by 組木紙織
作るのが(少し)大変な方法をしてる。。。
二重ループ使ったら簡単にできますよ。
Re:初級プログラミング
Posted: 2008年7月30日(水) 00:22
by たかぎ
追求すると後からいろいろ出てきそうなので、念のため確認します。
nに上限はありますか?
具体的には、unsigned intやunsigned longなどの組み込み型で表現できる範囲なのか、そうでないのかによって方針が変わります。
組み込み型で表現できる範囲に制限されないのであれば、多倍長演算が必要になります。
Re:初級プログラミング
Posted: 2008年7月31日(木) 02:33
by lbfuvab
一例として
#include<math.h>
unsigned int Search(unsigned int n,unsigned int *a,unsigned int *b){ //見つからなかったら0,見つかったら1
unsigned int i,j,k,bFind=0;
i=(unsigned int)ceil(sqrt(n));
for(j=0;j<i;j++){
for(k=0;k<i;k++){
if(j*j+k*k == n){
bFind=1;
goto LOOP_END;
}
}
}
LOOP_END:;
if(bFind){
*a=j;
*b=k;
}
return bFind;
}
とかですか。