前提・実現したいこと
文字列を用いれば現在の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; }
皆様のおかげでまた一歩前進できました。
今後ともきれいに書くように心がけていきたいと思います。
回答者様方ありがとうございました!
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。