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

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

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

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

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

標準出力

標準出力(stdout)は、プログラムが標準的に用いるデータ出力元。標準出力に書き込み要求を発行しすることにより、ディスプレイ装置にデータを表示することができます。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

Q&A

解決済

2回答

4840閲覧

長桁の積(定数倍)の計算

Ryo-chan

総合スコア9

C

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

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

標準出力

標準出力(stdout)は、プログラムが標準的に用いるデータ出力元。標準出力に書き込み要求を発行しすることにより、ディスプレイ装置にデータを表示することができます。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

0グッド

0クリップ

投稿2021/08/05 02:42

標準入力に100桁以下の正の整数値 a と1桁の正の整数値 m(1≦m≦9) をこの順で入力すると,a の m 倍(a×m)を計算して標準出力に出力するプログラムを作成しました。

#include <stdio.h> #include <string.h> #define DIGIT 100 int main(void) { char a[DIGIT] = {0}, b[DIGIT] = {0}, sum[DIGIT*2] = {0}, num[DIGIT]; int i, j, na, nb, r; scanf("%s", num); na = strlen(num); for (i=0; i<na; i++) a[na-1-i] = num[i]-'0'; scanf("%s", num); nb = strlen(num); for (i=0; i<nb; i++) b[nb-1-i] = num[i]-'0'; r = 0; for (i=0; i<nb; i++) { for (j=0; j<na; j++) { r = a[j] * b[i] + r; sum[i+j] += r % 10; r = r /10; } } if(r != 0){ sum[na+nb-1] = r; } for (i=na+nb-1; i>=0; i--) printf("%d", sum[i]); printf("\n"); return 0; }

ほどんどの標準入力に対してはうまく動作したのですが、
下記の入力結果のみ出力結果の先頭に余計な“0”が入ってしまいます。
修正案及びアドバイスの方をお願いします。

標準入力 12345678901234567890↵ 1 提出プログラムの標準出力 012345678901234567890↵ 正解の標準出力 12345678901234567890↵

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

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

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

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

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

BeatStar

2021/08/05 02:47

> 修正案及びアドバイスの方をお願いします デバッグする。 つか、当たり前の技術だし。 それと、コードがかなり読みづらい。 インデントが無いし。 読ませる気無いでしょ…
退会済みユーザー

退会済みユーザー

2021/08/05 04:24 編集

https://teratail.com/questions/351413 やってる事大体同じ内容だと思うけど、どっかの学校の課題? [推奨していない質問] https://teratail.com/help/avoid-asking > コードをください・デバッグしてください等の丸投げの質問 > 何かを作りたいのでコードを書いてほしい、学校の課題を解いてほしい等の質問は、具体的にプログラミングで困っている質問ではないと考え、推奨していません。
kaina

2021/08/06 00:59

プログラムは作ってなんとなく動いたら完成ではありません。 想定される全てのパターンの動作が想定通り動くのを確認出来て初めて完成です。 上記を確認する為に以下のページにあるような「テスト」を行いましょう。 https://type.jp/s/itac/article23.html
guest

回答2

0

ベストアンサー

ほどんどの標準入力に対してはうまく動作したのですが、

下記の入力結果のみ出力結果の先頭に余計な“0”が入ってしまいます。

12345678901234567890 x 1 = 01234567901234567890
これのみですか?
1 x 1 = 01
3 x 2 = 06
10 x 3 = 030
いくらでもあるではありませんか。

na桁と nb桁を掛け算したら結果は (na+nb-1)桁 または (na+nb)桁です。
1桁 x 1桁: 1 x 1 = 1(1桁), 9 x 9 = 81(2桁)
2桁 x 1桁: 10 x 1 = 10(2桁), 99 x 9 = 891(3桁)
3桁 x 2桁: 100 x 10 = 1000(4桁), 999 x 99 = 98901(5桁)

それなのに、結果は (na+nb)桁しかないと考え、
sum[na+nb-1], sum[na-nb-2], ... sum[0] を表示すると
先頭に 0 が来ることがあるのは当然です。

C

1 i = na + nb - 1; 2 if (sum[i] == 0) i--; 3 for (; i >= 0; i--) printf("%d", sum[i]);

こうすれば解決するのではありませんか?
ここまでの論理的考察は難しいですか?

ところが、質問のコードでは、007 x 1 = 0007 となり、
先ほどの修正を加えても 007 にしかなりません。
そこで、次のようにするとよいでしょう。

C

1 i = na + nb - 1; 2 while (i > 0 && sum[i] == 0) i--; 3 while (i >= 0) printf("%d", sum[i--]);

質問のコードには他にも多くの問題点があります。

char num[100]; だと scanf("%s", num); で 100桁の数字の文字列は
読み込めません。文字列の終端の '\0' が付加されることを考慮し、
char num[DIGIT+1]; としなければならないでしょう。

問題には「1桁の正の整数値 m(1≦m≦9) を」と書かれているのに
なぜか b[DIGIT] を用意して、100桁まで OK なコードにしようとしています。
ところが、そのコードが大間違いで 99 x 99 = 89181 となったりします。
b に 1桁の数を入れた場合はたまたま正しい結果になっているだけです。

投稿2021/08/05 16:17

kazuma-s

総合スコア8224

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

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

0

for (i=na+nb-1; i>=0; i--) printf("%d", sum[i]);と出力の桁数を決め打ちにしているので、「最初に0以外が来るまでは出力しない」ような処理が必要です。

投稿2021/08/05 02:45

maisumakun

総合スコア145184

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

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

Ryo-chan

2021/08/05 07:43

この設定の前に ``` if(r >= 0){ sum[na+nb-1] = r;} ``` を入れておりますが、これ以外にも処理が必要なのでしょうか?
maisumakun

2021/08/05 08:18

rが0の場合は無関係です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問