for文

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

for文

#1

投稿記事 by kerotan0820 » 15年前

皆様お久しぶりです
先日、高校の一次試験(都立)を終え、一息つけましたので、久々にプログラミングをやっています
都立問題の四角1に、以下のような問題がありました
(確立問題のちょっと違う形?のような問題ですw)

[問7]
1から6までの目の出る大小1つずつのさいころを同時に1回投げる。
大きいさいころの出た目の数をa,小さいさいころの出た目の数をbとするとき、
bがaの倍数となる目の出方は全部で何通りあるか。

簡単な問題なのですが、プログラムに直すとうまくいかないのです
(ちなみに、入試でこの問題は間違えましたw難しく考えすぎて意味の分からない回答を書いてしm..(ry )
このようなプログラムを組みました
#include<stdio.h>
int main(void){
    int a,b,A;
    for(a=1; a<6; a++){
        for(b=1; b<6; b++){
            A=a+b;
            if(b/A==0){
                printf("bはaの倍数です\n");
            }
        }
    }
return 0;
}
私の考え方としては、サイコロ(a)とサイコロ(b)を投げたと想定します
全パターンの計算をするために二重ループを使い、1*1から6*6まで計算するように組みました
サイコロ(b)の数が、サイコロ(a)の倍数であるのは何通りか、ということは、
A=a+bとして、bをAで割ればよいのではと考えました。割り切れたのであればbはaの倍数といえますからね。
割り切れた際は "bはaの倍数です" と表示するようにしました
結果上記のようなプログラムで実行してみました
すると、25個表示されました
何が問題なのでしょうか…;

それと、自分の知らない技術なのかも分かりませんが、"bはaの倍数です"とたくさん表示するのも良いのですが、bがaの倍数であったパターンが何パターンなのか文字で表示することは出来ないのでしょうか

単純に、"bはaの倍数です" と表示するのではなく、aがbで割り切れる限り変数 I に1を加算し続け、それを表示するようにしてみました
#include<stdio.h>
int main(void){
    int a,b,A,I=0;
    for(a=1; a<6; a++){
        for(b=1; b<6; b++){
            A=a+b;
            if(b/A==0){
                I++;
                printf("%d 通り\n",I);
            }
        }
    }
return 0;
}
ですが、これだと1通りです 2通りです 3通りです 4通りです... 、と表示されるだけです…;
最終結果だけ表示するにはどのようなプログラムを組めばよいのでしょうか


□追記□
文① <pre>~</pre> 文②<pre>~</pre> 文③
このような形で投稿すると文②の改行が効かなくなるのですが、原因は何なのでしょうか 画像

Poco

Re:for文

#2

投稿記事 by Poco » 15年前

1行移動させるだけでは?

----
#include<stdio.h>

int main(void){
int a,b,A,I=0;
for(a=1; a<6; a++){
for(b=1; b<6; b++){
A=a+b;
if(b/A==0){
I++;
}
}
}
printf("%d 通り\n",I);
return 0;
}

MNS

Re:for文

#3

投稿記事 by MNS » 15年前

受験ですか、公立中学の方々は大変ですね。

私は別に数学に秀でているわけではないのですが、bがaの倍数ということは、つまり、
b = ax (xは整数) ということになるのでしょうが、
はたして、b÷(a+b)が割り切れれば、bはaの倍数といえるのでしょうか?
そもそも、b<a+bですから、商が整数になる、ということにはならないと思います。

そんなに難しく考えず、bがaの倍数ということは、つまり、bをaで割った余りが0ということです。
割った余りを求める演算子は%ですから、つまり、b%aが0となれば、bはaの倍数ということになります。
これをプログラムするのは非常に簡単で、
if(b%a==0) これが満たされれば、bはaの倍数であるということです。
なので、変数Aは消去し、判定部分( if(b/A==0) )をif(b%a==0)に置き換えれば良いです。

>最終結果だけ表示するにはどのようなプログラムを組めばよいのでしょうか
これも非常に簡単に実装できます。

これを
#include<stdio.h>
int main(void){
int a,b,A,I=0;
for(a=1; a<6; a++){
for(b=1; b<6; b++){
A=a+b;
if(b/A==0){
I++;
printf("%d 通り\n",I);
}
}
}
return 0;
}

こうすればよいです。
#include<stdio.h>
int main(void){
int a,b,A,I=0;
for(a=1; a<6; a++){
for(b=1; b<6; b++){
A=a+b;
if(b/A==0){
I++;
}
}
}
printf("%d 通り\n",I);
return 0;
}

たくさん表示されてしまった理由は、printfがforループ内にあったので、計25回実行されてしまうからです。
よって、forループ外にprintfを出せば、一回だけ実行されるようになります。

box

Re:for文

#4

投稿記事 by box » 15年前

> if(b%a==0) これが満たされれば、bはaの倍数であるということです。

> こうすればよいです。
> if(b/A==0){

食い違っていますね。
修正されたというコードを、ご自分のところでテストされましたか?

MNS

Re:for文

#5

投稿記事 by MNS » 15年前

>boxさんへ
実行はしていませんが、
上と下の質問は切り離して回答しているつもりです。

と、いうよりは、やはりコードは自身の力で完成させて欲しかったのです。
誤解を生んだのであれば、申し訳ありません。

box

Re:for文

#6

投稿記事 by box » 15年前

> コードは自身の力で完成させて欲しかったのです。

だとすると、実行結果が仕様を満たしていないコードを載せるより、
文章による説明だけで十分だったのではないかと思います。

kerotan0820

Re:for文

#7

投稿記事 by kerotan0820 » 15年前

□ぽこ様
有難うございます^^
ループに入っているから繰り返されてるということにも気づかなかった自分が情けないです;
回答有難うございました

□MNS様
なるほど… 
修正してみた結果、10通りと表示されてしまいます
原因が何か分からないのでご指導お願いします
#include<stdio.h>
int main(void){
    int a,b,A,I=0;
    for(a=1; a<6; a++){
        for(b=1; b<6; b++){         
            if(b%a==0){
                I++;
            }
        }
    }
    printf("%d 通り\n",I);
    return 0;
}
□box様
結果が25になる理由と、ループされている理由を別件として扱って下さったのでしょうね^^;
一緒にしてしまったら答えそのものになってしまいますからねw

MNS

Re:for文

#8

投稿記事 by MNS » 15年前

そうですね。
たとえば、これを
for(a=1; a<6; a++){
for(b=1; b<6; b++){
if(b%a==0){
I++;
}
}
}

こう変えてみてください。
for(a=1; a<6; a++){
for(b=1; b<6; b++){
if(b%a==0){
printf("%dは%dの倍数です。\n", b, a);
I++;
}
else
printf("%dは%dの倍数ではありません。\n", b, a);
}
}

そして、出力された文を見て、おかしな点を探してみてください。
きっとすぐ気づくと思います。


>boxさんへ
はい、おっしゃる通りなのですが、
私は説明が下手な人間なので、いまいちうまく伝わるか不安だったのです。
別件で扱っていることを明記すべきでしたね。申し訳ありません。

Poco

Re:for文

#9

投稿記事 by Poco » 15年前

正しい答えは求めていませんが、
サイコロのは1~6なのに、ループは1~5までしか
回してないからでは?

kerotan0820

Re:for文

#10

投稿記事 by kerotan0820 » 15年前

□MNS様
a<=6にしたところ解決しました^^

□ぽこ様
その通りですw
単純なミスでした;

閉鎖

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