質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

4回答

28296閲覧

個数を数える[C言語]

ISARIA

総合スコア19

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2015/05/17 11:51

1から1000までの自然数のうち,
グループa:偶数
グループb:7の倍数+1
グループc:上のa,bどちらにも属する
にあてはまるものがいくつあるかを表示するプログラムを作成せよ

という課題なのですが、
forループを使って、計算するのかなと思ったのですが、個数をどうやって数えればいいかわかりません。
charを使うのかなと思ったのですが(←当たっていますか)、どう使えばいいのかわかりません。

ヒントをお願いします!

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

ngyuki

総合スコア4514

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ngyuki

2015/05/17 13:44

なお、この回答では 7 の倍数には -7 や 0 も含むとしています(実際の定義は数学系の人ではないので知りません)。
ISARIA

2015/05/17 14:19

回答ありがとうございました。 今回の授業の範囲がforループだったので、考え方が凝り固まってました。 そこについて指摘してくれたので、ベストアンサーです! ホントにありがとうございます!
otn

2015/05/17 14:33

数学の授業ならそれで良いけど、プログラミングの授業なら題意にそってループで書かないと駄目では?
ngyuki

2015/05/17 14:44

いや、ホンネを言えば、授業の課題にキチンと取り組むつもりならこんなところで聞くのではなく、授業の先生とかに聞くのがいいと思いますよ? そのために授業料払ってるんだから。 ただ、この問題を出した先生には「この問題、for とか使わなくても解けますよね?」と教えてあげると良いと思います。
guest

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

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ISARIA

2015/05/17 14:20

回答ありがとうございました。 そうですよね、普通に数学の知識で解けば良かったですよね、、 ありがとうございます!
guest

0

お邪魔します。

fizzbuzz問題ですね、これは。

単純にグループごとのint型の変数を用意して、if文の条件で見つかったら1足すというのを繰り返せばいいです。
いろんなアルゴリズムがあるとおもいますが(集合演算後に個数を数えるとか、行列でやるとか)、多分そんなの不要ですよね。

※ためしにやってみたのですが、ヒントをということだったので、ご自分で解けたら私のと見比べてはどうでしょう。案外質問者さんの回答のほうがよかったりして。。。www
回答例のリンク

以上、参考まで

投稿2015/05/17 12:31

ShinpeiYamamoto

総合スコア540

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ISARIA

2015/05/17 14:22

回答ありがとうございます。 結局自分は数学のような感じで解いていしまったので、全然違う形にまとまったのですが、こちらを参考にして、今からつくってみます。 ありがとうございました!
ISARIA

2015/05/17 14:46

forループを使う方を作ってみたのですが、根本的な理解が足りないのでしょうか、個数を表示させることができません。 groupA++;などについての説明をもらえますか? よろしくお願いします!
ISARIA

2015/05/17 14:59

よくよく考えてみたのですが、 groupA++;は、groupA += 1;⇔groupA=groupA+1 と同じ意味ですか?
ShinpeiYamamoto

2015/05/17 15:32

同じ意味ですよ!そのとおりですよ!
ShinpeiYamamoto

2015/05/17 15:50

ごめんなさい、お風呂にはいってて遅くなりました。orz でも独力で正解にたどり着くなんてすごいですね!いいなあ。骨があって。 自分の実装は問題の通りのことを、ただ素直に書いただけのものです。 ループで1から1000まで1を足してint型の変数iに入れていきます。 for文では括弧の中に(開始条件;終了条件;各ループの最後に実行される処理)を記載します。各ループの最後に実行される処理は通常、i++やi--などとしてループのステップをコントロールするのに使います。i+=2;などというのもできるし、i--としたら1づつ引くのでループのたび1づつ減っていきますね。 その中で、毎回、2の倍数(%は割った余りを計算する演算子で、5%2=1です)と7の倍数+1とその両方にあてはまる、という題意の条件を調べて、当てはまったらgroupA,groupB,groupCのそれぞれの変数に1を足す、という処理になっています。 ループが終了条件のi <= 1000を満たせば、つまり1000になったら処理が終了して、そこでprintfでgroupA,groupB,groupCの内容をコンソールに出力する処理を書いています。 一応思いつく限り自分の書いた処理については説明してみたのですが、また何かわからなかったら聞いてください。 ではでは。課題頑張ってくださいね!
ISARIA

2015/05/17 17:40

わかりやすい説明をありがとうございます。
guest

0

こんな感じで。

lang

1int countA = 0; 2ループ{ 3 if(条件A){ 4 countA++; 5 } 6} 7printf("条件Aの個数は %d 個\n",countA);

投稿2015/05/17 12:02

otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問