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

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

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

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

Q&A

解決済

1回答

2215閲覧

c言語 配列の掛け算について

assa

総合スコア35

C

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

0グッド

0クリップ

投稿2020/11/29 15:40

編集2020/11/29 16:48

C

1コー 2/*n1=123 n2=123 list1とlist2は下の桁からlist1[0]=3,list1[1]=2,list1[2]=1です。 3 4list2も同じです。のこりは0で埋めています。listnewもすべて0で埋めています。*/ 5 6 7void multiply(int n1,int n2,int *list1,int *list2,int *listnew){ 8 int carry=0; 9 int digit1=0,digit2=0,i=0,max,j=0,t,dit; 10 while(n1!=0){ 11 n1=n1/10; 12 digit1++;} 13 while(n2!=0){ 14 n2=n2/10; 15 digit2++;} 16 if (digit1>digit2) 17 max=digit1; 18 else 19 max=digit2; 20 if (max==digit2){ 21   for (;digit1>0;digit1--){ 22 carry=0; 23 for (i=0;i<max;i++){ 24 25 if (list1[j]*list2[i]+listnew[i+j]<10 && carry==0){ 26 listnew[i+j]=(list1[j]*list2[i]+listnew[i+j])%10; 27 } 28 else if (list1[j]*list2[i]+carry+listnew[j+i]<10 && carry!=0){ 29 listnew[i+j]=(list1[j]*list2[i]+carry+listnew[i+j])%10; 30 carry=0;} 31 else if (list1[j]*list2[i]+carry+listnew[i+j]>9 && carry!=0){ 32 listnew[i+j]=(list1[j]*list2[i]+carry+listnew[i+j])%10; 33 carry=(list1[j]*list2[i]+carry+listnew[i+j])/10; 34 } 35 else 36 {listnew[i+j]=(list1[j]*list2[i]+listnew[i+j])%10; 37 carry=(list1[j]*list2[i]+listnew[i+j])/10; 38 }} 39        if (carry!=0){ 40 listnew[i+1+j]=carry;} 41 42 j++;}}}

二つの配列の掛け算です。
digit1は二つあるうちの小さい方の数字の桁です。今回はlist1のほうが小さいです。
maxは大きい方の桁です。
list1とlist2ではすでにintの整数が代入されています。
listnewに掛け算した結果を代入したいです。
123×11ではあうのですが、123×123とすると14029となるずれます。
どこがおかしいのでしょうか。
全く違うかったらそうおっしゃてください。
ヒントだけでもどうかください。
どうぞよろしくお願いいたします。

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

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

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

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

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

kazuma-s

2020/11/29 16:20

> 123×123とすると14029となるずれます。 そうなるコンパイル可能なコードがあるんですよね。そのコード全体を示してください。 そうすれば、digit1 や list1 や list2 や listnew に何が入っているのか全部分かって、回答できるでしょう。
assa

2020/11/29 16:32

わかりにくくてすみませんでした
kazuma-s

2020/11/29 16:46 編集

全角スペースがあって、{ と } の対応が取れていないので、コンパイルできません。
assa

2020/11/29 16:48

わざわざすみません修正させていただきました。
guest

回答1

0

ベストアンサー

全角スペースがあってコンパイルできないし、
main がないとテストできないので書き直してみました。

C

1#include <stdio.h> 2 3int multiply(int n1, int n2, int *list1, int *list2, int *listnew) 4{ 5 int carry = 0, digit1 = 0, digit2 = 0; 6 do digit1++; while (n1 /= 10); 7 do digit2++; while (n2 /= 10); 8 for (int i = 0; i < digit1; i++) { 9 for (int j = 0; j < digit2; j++) { 10 listnew[i+j] += list1[i] * list2[j] + carry; 11 carry = listnew[i+j] / 10; 12 listnew[i+j] %= 10; 13 } 14 listnew[i+digit2] += carry; 15 carry = 0; 16 } 17 int k = digit1 + digit2 - 1; 18 if (listnew[k]) k++; 19 return k; 20} 21 22int main(void) 23{ 24 int n1 = 123, n2 = 123; 25 int list1[10] = { 3, 2, 1 }, list2[10] = { 3, 2, 1 }; 26 int listnew[22] = { 0 }; 27 int k = multiply(n1, n2, list1, list2, listnew); 28 for (int i = k; --i >= 0; ) putchar(listnew[i] + '0'); 29 putchar('\n'); 30}

投稿2020/11/29 17:22

編集2020/11/29 17:57
kazuma-s

総合スコア8224

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

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

assa

2020/11/29 17:26 編集

回答ありがとうございました。 本当にありがとうございます。 整い方が全然違うくて、きれいので、参考にしてがんばります。
kazuma-s

2020/11/29 17:57

carry の処理にバグがあったので修正しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問