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

C言語で整数の約数をすべて表示するプログラムを作りました。
このプログラムの場合、自然数のみ対応し、負の値を入力しても計算されません。
この問いは、このプログラムでも正しいのでしょうか?
それとも負の値を入力しても約数が表示されるようにしなければならないのでしょうか?
その場合どのように直せばよろしいのでしょうか?
ご指導、よろしくお願いします。
#include <stdio.h>

int main()
{
int i;

int n;

printf("整数を入力してください = ");
scanf("%d",&n);

printf("%dの約数は ", n);
for( i=1; i<=n; ++i ){
if( n%i == 0 )
printf("%d ", i);
}
printf("です。\n");

return 0;
}

A 回答 (4件)

追加補足です。



処理時間やその他の異常系の考慮をしないで良い前提の回答です。
scanfで数字以外を入力されたらどうするんだ、とか。

n/2よりも大きな約数はn自身しかありえないので、
ループもそこで止めた方が無駄な処理が減らせるとか。

色々考えると改善できる余地はあります。
授業の演習でそこまで求められないと思いますが。
    • good
    • 1
この回答へのお礼

ありがとうございました。
改善できました。

お礼日時:2016/04/26 19:13

やかましいことをいうと 整数 n に対して


n=ab となる整数a、bが約数なので
約数にも正負が有ります。
またn=0の時は n=0・a(aは任意の整数)
なので0を含む全ての整数が約数です。

でも、実用としては n、a、b>0 で充分なので
仕様を確認すべきでしょう。

それと効率の話ですが

約数は√(n)まで調べれば充分。√(n)より大きい約数は
√(n)より小さい約数でnを割れば求まります。
計算量が激減します。
    • good
    • 0
この回答へのお礼

ありがとうございました。
解決しました。

お礼日時:2016/04/26 19:12

これは授業の演習課題か何かですかね?



>それとも負の値を入力しても約数が表示されるようにしなければならないのでしょうか?

課題を出した側に確認した方がいいです。
言葉通りに、入力した整数の約数全てを出力しろ、という課題なら、負の約数も対象になりますが、
意図的に出題側がそうしたいのではなく、説明足りてないだけの可能性が高いです。

また、入力する整数の範囲の下限、上限もどこまで必要か確認した方が良いでしょう。
int型が扱える下限値、上限値が出題者の上限を超える場合は別の型を使ったり、
工夫が必要になります。

>この問いは、このプログラムでも正しいのでしょうか?

上記の確認の結果次第ですが、入力された値のチェックをした方が良いでしょう。

例えば、開発環境にもよりますが、int型が扱える上限が2147483647の場合に、
nに2147483647を入力してしまうと、上記プログラムは異常になります。
for文ループの最後に、iがnと等しくなった後に、++iをして時に、
iがint型が扱える最大値を超えてしまうからです。

入力した数値自身が約数であることは自明なので、イコールを消して、
for(i=1;i<n;i++)として、
for文の終わった後に、printf("%d",n);を追加するとしても良いかもしれません。
    • good
    • 0

問題が「入力された自然数の全ての約数を出力するプログラムを作りなさい」なのでしたら正しいでしょう。


しかし、問題が「入力された整数の全ての約数を出力するプログラムを作りなさい」なら正しくないでしょう。負と0の場合を含めて正しく動作する必要があります。

参考まで。
    • good
    • 0
この回答へのお礼

ご指摘、ありがとうございました。

お礼日時:2016/04/26 19:13

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