プロが教える店舗&オフィスのセキュリティ対策術

C言語初心者の質問失礼いたします。
C言語の講義を受けているものなのですが、講義の課題として、

3桁の整数で二乗すると下3桁がもとの数になるものをすべて求めなさい。

というものが出されました。
何をどのようにプログラムすればいいかさえ、まったくわかりません…。
簡単な問題だよと先生は仰っていたのですが、どうにもこうにわからずにいます 涙
どなたか、どうか一言でもかまいませんのでアドバイスいただけませんでしょうか?
よろしくお願いいたします…。

A 回答 (5件)

初歩的なアルゴリズムの学習ですね^^



まず、3桁の数字をabcと表すとその二乗は
(a*100 + b*10 +c)^2
=a*a*10000 + 2*a*b*1000 + (2*a*c + b*b)*100 + 2*b*c*10 + c*c
となります。

>3桁の整数で二乗すると下3桁がもとの数になるものをすべて求めなさい。
とのことなので、

(2*a*c + b*b)*100 + 2*b*c*10 + c*c

の部分だけを検討すれば良いことが判ります。

まずcについて式を検討すると、数式から下位一桁は
c*c mod 10 = c
とならなければならないので、cの数値は 0, 1, 5, 6 の4つしか無いことが判ります
またc=0については0になるのは自明なので計算する必要はありません。

次にbについて検討すると
(2*b*c*10 + c*c ) mod 100 = b*10 + c
とならなければなりません。cの値は4つですがc=0は式から、c=1,5,6のみ検討すれば良いことは自明です。またb=0については、c=0になるのが自明ですからこれも計算の必要がありません。

c=1の場合
(20*b + 1) mod 100 = b*10 + 1
2*b mod 10 = b
となり、bは存在しません。従って、最初のcのリストから1を削除します。

c=5の場合
(100*b + 25) mod 100 = b*10 + 5
(10*b + 2) mod 10 = b
b=2となります。

c=6の場合
(120*b + 36) mod 10 = b*10 + 6
12*b + 3 mod 10 = b
b=7となります。

すなわち、下位2桁は25と76のときのみ成立することが判ります。

最後にaを求めますが、a25とa76の18通りの組み合わせを計算すれば良いことになります。
ここから先は課題なので自分で考えてくださいね。

つまりアルゴリズムとしては、1桁めから数字の組み合わせの候補を絞っていけばよいといことです。
以上の考え方でプログラムを組んでみてください。
    • good
    • 0

質問者ではありません


No.2さん
プログラムという便利なのを知っていると
私は
力任せにすぐ for文などでやろうとしていましたが
紹介されたアルゴリズムを読んで
目からうろこです
ありがとうございました
    • good
    • 0

求める3桁の整数をxとし、それを画面に表示するだけだとします。


xを100から999まで動かして、xと2乗の下3桁を比較すればいいだけです。


for ( x=100; x<1000; x++ )
  if ( x == xの2乗の下3桁 )
    printf( "x=%d (2乗は%7d)\n", x, x*x );
※半角スペースでは全部左詰めになっちゃったため、全角スペースを使っています。
上をコピーして貼り付けても、エラーになりますよ。

でいいのではないでしょうか?
xの2乗の下3桁は、ものすごぉ~く簡単に求められます。

課題の内容からすると、この部分を考えさせるためだと思いますので、答えは控えます。
「アドバイス」だけといたします。
課題の内容がこれであるということは、その2乗の下3桁を求めるための手段は習っていると思います。
仮にそうでないとしても、どうすればそれが求められるか、を考えることが大切です。
プログラムは、事象をいかにして数学的に求めるか、です。

No1さんが答えておられますよ。
    • good
    • 0

プログラミングのことは抜きにして、純粋に数学的にどうすればよいかは分かりますか?


それが分からなければ、どうすることもできませんよ。
    • good
    • 0

・forを使って「三桁の整数」を総当たり


・下三桁は「1000で割った余り」で求められる

こんだけヒント出せばいくらなんでもわかりますよね?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!