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

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

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

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

Q&A

解決済

3回答

3212閲覧

C言語での長桁の差計算で、桁数を大きくするとエラーが出る

hagito

総合スコア4

C

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

0グッド

0クリップ

投稿2021/08/12 06:13

編集2021/08/12 06:39

C言語における長桁の差問題について

ここに質問の内容を詳しく書いてください。
標準入力に100桁以下の2つの正の整数値 ????,????(????≧????) をこの順で入力すると,それらの差(????−????)を計算して標準出力に出力するプログラムを作成しているのですが、桁数を大きくすると毎回ランダムな値が出てしまいます。

1*10の16乗まではちゃんと出ますが、それ以降になると毎回出力される値が変わってしまいます。

例えば、
1000000000000000000 - 1 = 毎回ランダムな数字

原因が分からないので、教えていただければと思います。

エラーメッセージ

該当のソースコード

#include <stdio.h> #include <string.h> #define DIGIT 100 int main(void){ char a[DIGIT], b[DIGIT], sum[DIGIT+1], num[DIGIT]; int i, na, nb, n, r, l; 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<na; i++) { if (a[i] >= b[i]) { r = a[i]-b[i]; } else if(a[i] == 0) { r = 10 -b[i]; a[i+1] -= 1; } else if(a[i] < b[i]) { r = a[i]+10-b[i]; a[i+1] -= 1; } sum[i] = r; } sum[i] = a[i]; l = strlen(sum); for (i=l-1; i>=0; i--) { if(sum[l-1]==0) { continue; } printf("%d", sum[i]); } printf("\n"); }

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

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

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

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

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

mather

2021/08/12 06:21

ソースコードはMarkdownのコードブロックを使って記述してください。質問は再編集できます。 https://teratail.com/help/question-tips#questionTips3-5-1 また、「桁数を大きくするとエラーが出ます」というときの「具体的な入力値」「表示されるエラー」を質問に記述してください。
hagito

2021/08/12 06:43

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

2021/08/12 09:03

1 - 1 が 0 になりません。
guest

回答3

0

[回答ではありません]
配列 : char a[DIGIT], b[DIGIT], sum[DIGIT+1], num[DIGIT]
を最初にきっちり0で埋めても同様の症状となりますか?

投稿2021/08/12 06:24

episteme

総合スコア16612

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

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

hagito

2021/08/12 06:44

返信ありがとうございます!試してみたところ、しっかり出力されました。ありがとうございました!
guest

0

ベストアンサー

abの桁数が違う場合に、bの配列の一部が未初期化のまま残って、それを参照してでたらめな値になっているような感じもします。

あと、100文字入れるにはchar[100]では足りません。最後のヌル文字も入れてchar[101]以上が必要です。

投稿2021/08/12 06:23

maisumakun

総合スコア146583

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

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

hagito

2021/08/12 06:45

ご回答ありがとうございます。初期化してchar[101]でやってみたところ、うまくいきました。ありがとうございました!
guest

0

1 - 1 が 0 になりません。本当に解決ですか?

C

1#include <stdio.h> // scanf, putchar 2#include <string.h> // strlen 3 4#define DIGIT 100 5 6int main(void) 7{ 8 char a[DIGIT] = { 0 }, b[DIGIT] = { 0 }, sum[DIGIT], num[DIGIT+1]; 9 int i, na, nb, r; 10 11 scanf("%s", num); 12 na = r = strlen(num); 13 for (i = 0; i < na; i++) a[--r] = num[i] - '0'; 14 15 scanf("%s", num); 16 nb = r = strlen(num); 17 for (i = 0; i < nb; i++) b[--r] = num[i] - '0'; 18 19 for (r = i = 0; i < na; i++) { 20 sum[i] = a[i] - b[i] - r; 21 if (r = sum[i] < 0) sum[i] += 10; 22 } 23 i = na; 24 while (--i > 0 && sum[i] == 0) ; 25 while (i >= 0) putchar(sum[i--] + '0'); 26 putchar('\n'); 27}

投稿2021/08/12 09:25

編集2021/08/12 09:28
kazuma-s

総合スコア8222

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

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

hagito

2021/08/12 20:15

メッセージありがとうございます。 おっしゃる通りです。。。配列を初期化したことで改善はされたのですが、1-1の場合、出力されません。ただ、自分の計算式のどこに問題があるのかわかりません。 教えていただければありがたいです。
kazuma-s

2021/08/12 23:08

引き算の計算自体は問題ないようですが、表示に問題があります。 1 - 1 の計算で、配列 sum[0] は 0 です。l = strlen(sum) で、l は 0 になります。 すると、forループは 1度も実行されず、表示は行われません。 456 - 253 が 3 になります。 計算結果は sum[0] = 3, sum[1] = 0, sum[2] = 2, sum[3] = 0。 sum[1] が 0 だから、l = strlen(sum) で、l は 1 です。 forループを 3回まわらないと "203" とは表示されません。 どうやってデバッグしていますか? デバッガでステップ実行して変数の値の変化を見ていますか? printf を挿入して変数の値の変化を見ていますか? 何通りのテストデータでテストしていますか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問