1から1000までの自然数のうち,
グループa:偶数
グループb:7の倍数+1
グループc:上のa,bどちらにも属する
にあてはまるものがいくつあるかを表示するプログラムを作成せよ
という課題なのですが、
forループを使って、計算するのかなと思ったのですが、個数をどうやって数えればいいかわかりません。
charを使うのかなと思ったのですが(←当たっていますか)、どう使えばいいのかわかりません。
ヒントをお願いします!
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
ベストアンサー
forループを使って、計算するのかなと思ったのですが、個数をどうやって数えればいいかわかりません。
うーん、for でループを回さなくても解けると思いますが・・・個数を表示するだけですよね?
グループa:偶数
1 から 1000 までに偶数がいくつあるか考えればすぐわかりますよね?
そのとき、1 から 1000 まで指折り数えたりはしていないはずです。
そんなことをしなくても「1 から 1000 までに偶数がいくつあるか」という問題文を見た時に、
直ちに答えを頭に思い浮かべることが出来たはずです。
それはとても簡単な計算式だと思うので、それをプログラムとして書けばいいです。
グループb:7の倍数+1
7の倍数+1 は以下のように表せます。
7n + 1 (n は整数)
この値のうち 1 から 1000 までの値を考えます。つまり、下記の2つを満たす n の範囲です。
7n + 1 >= 1 7n + 1 <= 1000
前者の式を移行して整理すると・・・
7n + 1 >= 1 7n >= 1 - 1 n >= (1 - 1) / 7 n >= 0
よって n の最小値は 0 です。
後者の式を移行して整理すると・・・
7n + 1 <= 1000 7n <= 1000 - 1 n <= (1000 - 1) / 7 n <= 142.7142857142857... n <= 142 (n は整数だから)
よって n の最大値は 142 です。
つまり、7の倍数+1 の値は以下のとおりに表せます。
7n + 1 (n は 0 から 142 までの整数)
ここまでくれば、もう答えはわかったようなものです。
グループc:上のa,bどちらにも属する
「7の倍数+1」は、偶数→奇数→偶数→奇数 の順に現れます。
「7の倍数+1」の個数が仮に X 個だとしたら、その X 個のうち何個が偶数であるかは簡単に求められるはずです。
この問題、もちろん for でループを回せば簡単に解けますが、1 から 1000 ではなく、1 から 1000000000000000000 とかだとかなり厳しいですよね。
出題者がどういう意図でこの課題を出題したのかは判りませんが、for でまわさなくても計算によって導出できるなら、その方が回答としては適切だと思います。
投稿2015/05/17 13:37
総合スコア4514
0
1 から 20 で考えてみます。
偶数は
2,4,6 ... 20 で 10 個。 (20 / 2 = 10)
7 の倍数 + 1 の個数は
8, 15 で 2 個。( (20 - 1) / 7 = 2)
偶数 かつ 7 の倍数 + 1 の個数 は
8 で 1 個 ( ((20 - 8) / 14)
(8, 22, 36, .. と続く)
従って 1 から 10000 なら
5000 (= 1000 / 2)
1428 (= 9999 / 7 = 1428.4...)
714 (9992 / 14 = 714.7...)
↑ はプログミングせずに、数学の知識だけでの考察です。
プログラミンでとくなら、単に↑での計算式の値を表示させればよいです。
あるいは
グループa, ブループb,
実際に 1 から 1000 の数字をループさせ、
2 で割ったあまりが 0 なら グループa の個数カウンターに +1
7 で割ったあまりが 1 なら グループb の個数カウンター に +1
2 で割ったあまりが 0 かつ 7 で割ったあまりが 1 なら グループb の個数カウンター に +1
とします。
グループ a の個数を数える場合のプログラム例を示します。
lang
1#include<stdio.h> 2 3int main() { 4 int count_a = 0; 5 for (int i = 1; i <= 100; i++) { 6 7 if (i % 2 == 0) { 8 count_a += 1; 9 } 10 11 } 12 printf("グループ a の個数: %d\n", count_a); 13}
投稿2015/05/17 13:31
総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
お邪魔します。
fizzbuzz問題ですね、これは。
単純にグループごとのint型の変数を用意して、if文の条件で見つかったら1足すというのを繰り返せばいいです。
いろんなアルゴリズムがあるとおもいますが(集合演算後に個数を数えるとか、行列でやるとか)、多分そんなの不要ですよね。
※ためしにやってみたのですが、ヒントをということだったので、ご自分で解けたら私のと見比べてはどうでしょう。案外質問者さんの回答のほうがよかったりして。。。www
回答例のリンク
以上、参考まで
投稿2015/05/17 12:31
総合スコア540
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/05/17 14:22
2015/05/17 14:46
2015/05/17 14:59
2015/05/17 15:32
2015/05/17 15:50
2015/05/17 17:40
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/05/17 13:44
2015/05/17 14:19
2015/05/17 14:33
2015/05/17 14:35
2015/05/17 14:44