無題

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

無題

#1

投稿記事 by ユーリ » 16年前

キーボードから整数n(2~20の間)を入力する。割る数をwとして、nの値から始めて1ずつ減らしながら
割る数が1になるまで、割り切れる値をすべて表示する。
という問題なんですがどのようにしたらよいのでしょうか?

山崎

Re:無題

#2

投稿記事 by 山崎 » 16年前

こんばんは。

う~ん、学校の課題でしょうか?
とりあえず自分でやってみて、
「このようにやってみたのですが、こんなエラーが出て上手くいかないのですがどうしたらいいのでしょう」
って感じで質問すると答えるほうも心証が良いかもしれませんね。
利用規約の中にあるとおり、学校の課題なのかどうかとか、どのくらいのCの知識があるのかを
明記していただければ、答えるほうも答えやすいですね。
ってすいません、最初から説教じみてしまい…

大まかな流れとしては、

1.変数wを宣言し、初期値を入れておく。
2.キーボードから入力した値を変数nに格納する。
3.繰り返し構文の中で、wと「nを1ずつ減らしていった値」の割り算の余りを求める。
4.その余りが0ならば、割り切れる数として表示する。

って感じでしょうか。
このようにすれば大体できると思います。

box

Re:無題

#3

投稿記事 by box » 16年前

> 割る数が1になるまで、割り切れる値をすべて表示する。

「割り切れる値」の定義は明確ですか?
例えば、6÷2=3のとき、
出力したい値は何ですか?

ユーリ

すいませんでした

#4

投稿記事 by ユーリ » 16年前

これは学校の課題です
それでですね
#include <stdio.h>

main()

{
int a,i,n,w;
printf("nを入力してください\n");
scanf("%d",&n);
scanf("%d",&w);
if(n>=2&&n<=20){
}
else{
printf("error!");
}

for(i=n;n>=2&&n<=20;n--){
a=w%n;
}
if(a==0){
printf("w%n=%d\n",a);
}

return 0;

}
ここまで作ってみたんですがエラーが出てしまいます。
アドバイスの方をお願いします。

山崎

Re:すいませんでした

#5

投稿記事 by 山崎 » 16年前

う~ん、コードを貼る時はpreタグでコード部分を囲ったほうが見やすいですね。利用規約のとおりです。
まぁ、この掲示板に初めて来た人なら見落とすこともあるでしょう…次回があればお気をつけください。

まず、メイン関数の最初
int main()
の「int」が抜けてますね。

最初のif文の
if(n>=2 && n<=20)
ですが、ここではキーボードから入力された値が、適正な範囲にあるかどうかを判別したいのですよね。
値が適正な範囲にない場合だけ"error!"を表示すればいいのですから、
このif文は「nが適正な範囲にない」ことを検出するようにしたほうが良いでしょう。
そうすれば、else文を用いなくても、値の範囲が正しければ次の処理に移ることができます。
あと、もし値が適正な範囲にない場合は、"error!"を表示した後にプログラムを終了させるなどの処理をしてはいかがでしょう。

次のfor文ですが、カウンタiの値の範囲が妙なことになってますね。
一応、処理がこのfor文にたどり着くということはnの値が適正な範囲にあるとわかったわけですから、
&&n<=20
は要りません。

このfor文の中で、wと「nを1ずつ減らしていった値」の割り算の余りを求めるといいでしょう。
貼っていただいたコードを見ると、まずw%nの値をaにいったん格納し、
その後aの値が0かどうか判断しているようですね。
これでもいいのですが、w%nの値を直接if文で判別に用いても大丈夫です。

最後のif文の中なのですが、
if(a==0)
printf("w%n=%d\n",a);
これですと、表示されるaの値は0だけになってしまいますが、よろしいのでしょうか?
このif文の中に来るということはa==0が成り立っているのですから、当然表示されるaの値は0です。

いろいろ試行錯誤をしてがんばってみてください、
プログラミングの上達には、失敗が欠かせません。

ユーリ

無題

#6

投稿記事 by ユーリ » 16年前

割る数をwとして、nの値から始めて1ずつ減らしながら
割る数が1になるまで、割り切れる値をすべて表示する。
この部分がいまいちどうしてもわかりません
ヒントをもらえないでしょうか?

山崎

Re:無題

#7

投稿記事 by 山崎 » 16年前

がんばってますね~、その調子です。

「nの値から始めて、nを1ずつ減じながら、n=1になるまで繰り返す」という処理は、

for(i=n ; 1<i ; i--)
{
//ここに繰り返したい処理を書く
}

こんなfor文になります。

「wを割り切るiの値を表示する」には、
まず「iがwを割り切るかどうか」を判定しなければいけません。
iがwを割り切るかどうかは、wからiを割った余りが0になるかどうかである事はわかりますね?
つまりif文で、w÷iの余りが0になるかどうかを判別すればいいわけです。
具体的に書くと、
if(w%i==0)
ですね。
この式が成り立つときにiの値を表示すればいいので、
このif文の中にprintfでiを表示させるとよいでしょう。

このif文をさっきのfor文の{}の中で繰り返せばいいので、
for(i=n ; 1<i ; i--)
{
    if(w%i==0)
        printf("w=%d を割り切る値は %d\n",w,i);
}
とでもすると良いでしょう。

ユーリ

ありがとうございました

#8

投稿記事 by ユーリ » 16年前

ありがとうございました!
ご丁寧に解説していただき、大変助かりました。
今後も頑張っていきたいと思います。

pooka

Re:無題

#9

投稿記事 by pooka » 16年前

wの値はどのように変化するかイメージしてみてください。
nの値から始めるということなのでwの初期値はn、
割る数が1になるまでということはwが1になるまで、1ずつ減らす
これをfor文を使うと例えば
for(w=n;1<=w;w--)
こんな感じになります。
割り切れる値はn%wの値が0になる時なのでそれをif文の条件とします。
そしてその時に割り切れる値、つまりwの値を表示するようにすればいいと思います。

pooka

Re:無題

#10

投稿記事 by pooka » 16年前

すでに解決されたみたいですね・・・

ちょっと思ったんですが
>割る数をwとして、nの値から始めて1ずつ減らしながら割る数が1になるまで
とあるので、
>nの値から始めて、nを1ずつ減じながら、n=1になるまで繰り返す
というのとは違うのではないでしょうか?

山崎

Re:無題

#11

投稿記事 by 山崎 » 16年前

pookaさん

私もfor(i=n;1<=i;i--)かなぁと最初に思ったのですが、
整数を1で割っても必ず余りは0になるので、
この場合に関してはこの課題は必要としていないのでは?と考えました。
もし、この課題を出した先生がn==1の場合の結果も必要としていたのなら申し訳ないことをしてしまいました。

ユーリ

Re:無題

#12

投稿記事 by ユーリ » 16年前

みなさんありがとうございます。
詳細は学校で確かめます。
本当にありがとうございました。

pooka

Re:無題

#13

投稿記事 by pooka » 16年前

う~ん・・・
一応今作ったものを載せてみます。
#include <stdio.h> 

int main(){
	int n,w; 
	printf("nの値を入力してください\n"); 
	scanf("%d",&n); 

	if(2 <= n && n <= 20){
		for(w=n;0<w;w--)
			if(n%w == 0)
				printf("割り切れる数は%dです。\n",w);
	}else
		printf("入力エラー\n");
	
	return 0; 
}

フリオ

Re:無題

#14

投稿記事 by フリオ » 16年前

 
>整数を1で割っても必ず余りは0になるので、
>この場合に関してはこの課題は必要としていないのでは?と考えました。

 約数を全て書き出せ。
ということではないでしょうか。
それなら、1とその数自身も含まれます。
 

閉鎖

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