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

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

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

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

C++/CLI

C++/CLIは、.NET Frameworkの共通言語基盤であるCLI向けにC++を拡張したプログラム言語です。前身のC++マネージ拡張と比較するとシンプルで分かりやすい構文になっており、高い可読性を持ちます。

Q&A

解決済

2回答

766閲覧

九九の組み合わせを出力するプログラム

Winter_1214

総合スコア11

C

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

C++/CLI

C++/CLIは、.NET Frameworkの共通言語基盤であるCLI向けにC++を拡張したプログラム言語です。前身のC++マネージ拡張と比較するとシンプルで分かりやすい構文になっており、高い可読性を持ちます。

0グッド

0クリップ

投稿2020/08/11 14:20

前提・実現したいこと

中学の夏休みの宿題で、どうしてもわからないので質問させていただきました。
正の整数を入力すると九九の組み合わせを出力するプログラムを作成したいのですが、
どのようにプログラムしたら良いかわかりません。教えていただきたいです。
入出力結果は以下の画像の通りです。
イメージ説明

該当のソースコード

c

1#include <stdio.h> 2 3int main(int argc, const char * argv[]) { 4 int a,x,y; 5 6 while(1){ 7 printf("input (>0,end=0): "); 8 scanf("%d",&a); 9 10 for(x=1;x<=9;x++){ 11 for(y=1;y<=9;y++){ 12 if(a==x*y){ 13 printf("%d = %d × %d\n",a,x,y); 14 } 15 16 } 17 } 18 if(a<0){ 19 printf("please input positive value\n"); 20 } 21 if(a==0){ 22 printf("end.\n"); 23 break; 24 } 25 } 26 return 0; 27} 28

試したこと

素数を試してみましたが、12,13があり苦戦したのでやめちゃいました。

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

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

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

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

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

guest

回答2

0

ベストアンサー

だいたいできてるのでは。あとは、

  • 九九が見つからなかった処理を行なえるように、見つかった九九の数を数えておく(かフラグを立てる)
  • 見つかった九九の数が0のときの処理をforループの後に書く
  • マイナスの値の処理は、九九との一致を調べる前に行ない、continueする
  • 0の値の処理は、九九との一致を調べる前に行ない、breakする

くらいじゃないかな。

C

1#include <stdio.h> 2 3int main(void) 4{ 5 while (1) { 6 printf("input (>0,end=0): "); 7 8 int a; 9 scanf("%d", &a); 10 11 if (a < 0) { 12 puts("please input positive value"); 13 continue; 14 } 15 if (a == 0) { 16 puts("end."); 17 break; 18 } 19 20 int count = 0; 21 for (int x = 1; x <= 9; x++) { 22 for (int y = 1; y <= 9; y++) { 23 if (a == x * y) { 24 printf("%d = %d x %d\n", a, x, y); 25 count++; 26 } 27 } 28 } 29 if (count == 0) { 30 puts("there is no combination."); 31 } 32 } 33 34 return 0; 35}

投稿2020/08/11 14:37

Daregada

総合スコア11990

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

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

Winter_1214

2020/08/11 15:21

無事完成しました。 まだまだ、未熟だということを改めて実感させられました。 本当にありがとうございます。
guest

0

for の二重ループで、81通りを全部調べるのは無駄ですよね。
割り算は使いますけど、9回以下の回数で調べることができます。

C

1#include <stdio.h> 2 3int main(void) 4{ 5 int a, x, y; 6 7 while (1) { 8 printf("input (>0,end=0): "); 9 if (scanf("%d", &a) != 1 || a == 0) { 10 puts("end."); 11 return 0; 12 } 13 if (a < 0) { 14 puts("please input positive value"); 15 continue; 16 } 17 int f = 0; // find flag 18 for (y = 9; y > 0; y--) { 19 if (a % y == 0) { 20 x = a / y; 21 if (x > 9) break; 22 printf("%d = %d × %d\n", a, x, y); 23 f = 1; // found!! 24 } 25 } 26 if (f == 0) // not found 27 puts("there is no combination."); 28 } 29}

間違って数字以外の文字を入力した場合でも終了するようにしています。

投稿2020/08/11 15:59

編集2020/08/12 02:09
kazuma-s

総合スコア8224

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

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

Daregada

2020/08/12 01:12

「return 0;」の後ろの「}」が抜けてんじゃね?
kazuma-s

2020/08/12 02:09

ご指摘ありがとうございます。修正しました。
Winter_1214

2020/08/12 09:24

確かにそうですね!2重ループでするより、 割り算を使用したほうが少ない回数で済みますね。 すみません、そこまで頭が回ってませんでした。 参考にさせていただきます。ありがとうございます。
Daregada

2020/08/12 09:32

さらに、無限ループする前に、一度だけ1~81までの答えをあらかじめ保存しておけば……とかやりようはいくつも考えられます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問