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

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

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

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

Q&A

解決済

3回答

1351閲覧

文字列を用いた計算(掛け算)へのアドバイスお願いします

rainy_073

総合スコア15

C

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

0グッド

0クリップ

投稿2018/09/21 14:38

編集2018/09/22 02:12

前提・実現したいこと

文字列を用いれば現在のint型計算よりも大きい数字で掛け算ができると思い、書いてみました。
一応100桁くらいを目標に書きました。
初心者なので無駄な部分や違う部分が多々あると思います。
どのように改善していけばいいか、アドバイスをお願いします。

該当のソースコード

C言語

1ソースコード 2#include <stdio.h> 3 4int main(void) { 5 char str1[100],str2[100],sum[200],oki; 6 scanf("%s %s",str1,str2); 7 int i,j,k,l,cal=0,pl[10000]; 8 for(i=0;i<10000;i++) pl[i]=-1;//plをー1で埋める 9 for(i=0;str1[i]!='\0';i++);//桁数を調べてる 10for(j=0;str2[j]!='\0';j++); 11for(k=i-1,i=i-1;k/2<i;i--){//str1を計算しやすいように反転 12oki=str1[i]; 13str1[i]=str1[k-i]; 14str1[k-i]=oki; 15} 16for(l=j-1,i=j-1;l/2<i;i--){//str2も 17oki=str2[i]; 18str2[i]=str2[l-i]; 19str2[l-i]=oki; 20 21 22} 23for(i=0;i<=k;i++){//計算 24 for(j=0;j<=l;j++){ 25cal=(str1[i]-'0')*(str2[j]-'0'); 26if(pl[i+j]==-1) 27pl[i+j]=0; 28pl[i+j]+=cal%10; 29if(cal>9){ 30 if(pl[i+j+1]==-1) 31 pl[i+j+1]=0; 32 33pl[i+j+1]+=cal/10; 34 35 36} 37 } 38} 39 40 41for(j=0;pl[j]!=-1;j++){ 42if(pl[j]>9){ 43 if(pl[j+1]==-1) 44 pl[j+1]=0; 45pl[j+1]+=pl[j]/10; 46pl[j]%=10; 47} 48} 49for(i=0;pl[i]!=-1;i++); 50i--; 51for(j=i;j>=0;j--){ 52 53 sum[i-j]=pl[j]+'0'; 54 55} 56 57printf("%s\n",sum); 58 59 return 0; 60}
改良後のソースコード #include <stdio.h> #include<string.h> int main(void) { char str1[100],str2[100],sum[200],oki; scanf("%s %s",str1,str2); int i,j,keta1,keta2,cal=0,pl[10000]; for(i=0;i<10000;i++) pl[i]=-1;//plを後の計算(桁繰り上げ)で用いるためにー1で初期化 for(keta1=i=strlen(str1)-1;keta1/2<i;i--){//str1を計算しやすいよう(桁を合わせるため)に反転 oki=str1[i]; str1[i]=str1[keta1-i]; str1[keta1-i]=oki; } for(keta2=i=strlen(str2)-1;keta2/2<i;i--){//str2も同様に oki=str2[i]; str2[i]=str2[keta2-i]; str2[keta2-i]=oki; } for(i=0;i<=keta1;i++){//1つ1つ計算してpl配列に代入(桁繰り上げはしない) for(j=0;j<=keta2;j++){ cal=(str1[i]-'0')*(str2[j]-'0'); if(pl[i+j]==-1) pl[i+j]=0; pl[i+j]+=cal; } } for(j=0;pl[j]!=-1;j++){//桁繰り上げ if(pl[j]>9){ if(pl[j+1]==-1) pl[j+1]=0; pl[j+1]+=pl[j]/10; pl[j]%=10; } } for(i=j=j-1;i>=0;i--){//反転処理をしていたのでもどす sum[j-i]=pl[i]+'0'; } printf("%s\n",sum); return 0; }

皆様のおかげでまた一歩前進できました。
今後ともきれいに書くように心がけていきたいと思います。

回答者様方ありがとうございました!

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

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

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

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

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

guest

回答3

0

ベストアンサー

多倍長整数演算の乗算処理は見ていません。
コードに関してぱっと気になったところだけ記載します。

  • インデントを揃える。手でやるのが面倒ならフォーマッターで自動整形する。

インデントが乱れてて、読みづらいです。

  • 標準ライブラリでできる部分は自作しない。

例えば、文字数カウントは strlen() でできます。

  • 変数をいろいろ使い回さない。

i, j が数字の桁数を格納するのに使われていたり、for ループの添字で使われていたり、場所によって違う意味で使われています。

  • コメントをもう少しつける。長い処理や繰り返し使う処理は関数化する。

  • 変数名をちゃんと考える。

変数名が長くなっても、わかりやすさ重視でよいです。

コードも文章と同じで、他の人がぱっと見て何をやってるかすぐにわかるコードを心がけてみてください。

投稿2018/09/21 15:16

tiitoi

総合スコア21954

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

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

0

3年前に同じことをCodeZineでやりました。C++だけど。

投稿2018/09/22 01:56

episteme

総合スコア16614

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

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

0

一番改善しないといけないことは、綺麗に書くこと。
これに尽きる。
少なくとも人に見てもらうコードがこれではいただけない。

次にコメントが必要なコメントを入れること。
例えば、**「plをー1で埋める」**なんてのは見ればわかること。
書くなら、どうして-1で埋めるのかの理由を書くべき。

投稿2018/09/22 01:28

ttyp03

総合スコア16996

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問