約数を求める問題について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
高校生

約数を求める問題について

#1

投稿記事 by 高校生 » 12年前

はじめまして、高校2年生です 授業でだされた 「1から1000までの間の3の約数を求めるプログラムを作成せよ」t歩い問題で 1と3 が答えとして出てくればいいというのはわかったのですが、処理をどうやって書いていいかわかりません 教えていただけませんでしょうか

box

Re:学校の課題について

#2

投稿記事 by box » 12年前

3の「倍数」ではないのですか?
3の約数ならば、別に1000までという範囲を決めなくても
最初から1と3だけに決まってますよね。

バグ

Re:学校の課題について

#3

投稿記事 by バグ » 12年前

3÷nの計算を行い、余りが0の数値を表示すればいいというところまでは分かりますね?
ここまで分かれば、nが1~1000の間だけ処理を繰り返せばいい訳ですが、このやり方が分からないという事でしょうか?

まず、nが1~1000の間だけ繰り返す処理ですが、ループのやり方は習ってますか?while文や、for文と呼ばれているやつを使用するのが一般的だと思うのですが、こういう課題が出ているくらいですから、習っているものとして話をすすめますので、分からなければ質問してください。

今回は1~1000の間だけ繰り返すという処理ですから、for文の方が理解しやすいかと思いますので、こちらを利用します。

int n;
for( n = 1 ; n <= 1000 ; n++ )
{

}

こんな風に使います。始めに変数nに1を代入して、nが1000以下の間だけループを続けて、ループを1周する毎にnの数値に1を足しなさいという意味です。つまり、nが1から始まって、1001になった時点でループが終了する訳です。


次に肝心の計算部分ですが、3÷nの計算をした余りを求める式というのは…

int val;
val = 3 % n;

こんな感じに表記します。今回の課題の場合は、約数を求めるという事ですから、余りが0の時だけ画面に表示すればいいので、valが0の時だけnを表示するという条件分岐を行う必要があります。これを実現させるにはif文を利用します。

if( val == 0 )
{
printf( "%d" , n );
}

こんな感じですね。

あとは前記のループと計算部分を組み合わせるだけです。ほぼ回答のようになってしまいましたが、ここから先は自分で何とかしてみてください。その方が理解度が高くなるはずですしね。

もし、どうしても分からなければ、何が分からなかったかを書き込みしていただければ、できる限りお答えしますので、頑張ってみてください(^-^)

管理人

Re:学校の課題について

#4

投稿記事 by 管理人 » 12年前

バグさん、アイコンが管理人になってたので、「回答」にしておきました^^;

高校生さん、もう一度問題文を確かめて投稿してもらえませんか?

バグ

Re:学校の課題について

#5

投稿記事 by バグ » 12年前

>>バグさん、アイコンが管理人になってたので、「回答」にしておきました^^;

うわっ、失礼しました~(^_^;)

高校生

Re:学校の課題について

#6

投稿記事 by 高校生 » 12年前

早速のアドバイスありがとうございます 何度確かめても「約数」を求めるとなっています。課題を作成した先生もはっきり約数だと言っていました

box

Re:学校の課題について

#7

投稿記事 by box » 12年前

約数で合っているのですか…。
そうすると、「1000までの数」は、
実は3以上なら何でもよくなります。
1000でなければならない理由がないですね。
倍数ならば、上限の数によって出力結果が変わりますので、
「~まで」には十分に意味がありますが…。

高校生

Re:学校の課題について

#8

投稿記事 by 高校生 » 12年前

boxさんへ
同じように先生に「出てくるのは 1と3なので1000まで繰り返す必要ないんじゃないんですか」とお聞きしたところ、「ちょつとした引っ掛け問題だよ、とにかくめんどくさくても1000の値までの処理を繰り返し、その間の約数として 1と3がでてくればいいだけだよ」 といわれたのですが、 現在よくわからず混乱しています

keichan

Re:学校の課題について

#9

投稿記事 by keichan » 12年前

問題の本質的には設定する必要はないが、回答者を少しでも困らせるために
余計な情報を与えている。ということでしょう。

高校生

Re:学校の課題について

#10

投稿記事 by 高校生 » 12年前

#include <stdio.h>

int n, val;
val = 3 % n;
for( n = 1 ; n <= 1000 ; n++ )
if( val == 0 )
printf( "%d" , n );
}
return 0
}
アドバイスを参考に自分で作ってみたのですが、こんな感じになったのですが大丈夫でしょうか 違っているところなど ご指摘よろしくおねがいします 

バグ

Re:学校の課題について

#11

投稿記事 by バグ » 12年前

1:main関数が無い
2:値が割り当てられてないnを使っている
3:}の数がおかしい
4:return 0の後ろに;がない
5:valを計算している場所がおかしい

以上の不具合を考慮したサンプルです。
#include <stdio.h>

int main()
{
	int n, val;
	for( n = 1 ; n <= 1000 ; n++ )
	{
		val = 3 % n;
		if( val == 0 ) 
			printf( "%dn" , n );
	}
	return 0;
}

管理人

Re:学校の課題について

#12

投稿記事 by 管理人 » 12年前

高校生さん、
解決されましたか?
先生の回答からして、keichanさんの推測どおりとしか考えられません・・。
無駄な計算をかなりするようですが、
バグさんの回答が最適だと思います。

お書きになったプログラムですが、

#include <stdio.h>

ここ、int main(){
とかかないとダメです。どんなプログラムでも、必ずmain関数が必要です。
途中でプログラムかいてて消してしまっただけなんでしょうか?

int n, val;
val = 3 % n;

これでは、ループの中で計算ができません。
1000まで計算したいのならループの中で計算しましょう。

for( n = 1 ; n <= 1000 ; n++ )

ここには括弧のはじまりがひつようです。

if( val == 0 )
printf( "%d" , n );

printfは改行コードをかかないと次表示する値と連続してしまい、わからなくなってしまいます。


}
return 0
}

高校生

Re:学校の課題について

#13

投稿記事 by 高校生 » 12年前

ありがとうございました。一歩ずつですががんばっていけそうです

管理人

Re:学校の課題について

#14

投稿記事 by 管理人 » 12年前

あ、バグさんのサンプル
\n
のエスケープシーケンスが抜けてます。
printf( "%d\n" , n );
ほんとはこうなります。

閉鎖

“C言語何でも質問掲示板” へ戻る