ある国の借金は800兆近くあったりします。財部誠一 オフィシャルホームページ [借金時計]と、横道にそれました。
今回は多倍長計算を行いたいと思います。多倍長計算とはint型で扱うことが出来ないような大きな数、doubleで扱うことが出来ないような小数点以下数百桁とかという数を扱い計算です。
今回は80桁までの正の整数を2つ受け取りその数の和を出力してください。
与えられる数は10進数。結果が80桁を超える場合にはoverflowと出力してください。
なお、入力データはカレントディレクトリの018.datにあります。
80桁以内の多桁数1(整数文字列)
80桁以内の多桁数2(整数文字列)
入力の2つの数の和(整数文字列)
12345678901234567890123456789012345678901234567890123456789012345678901234567890
87654321098765432109876543210987654321098765432109876543210987654321098765432109
99999999999999999999999999999999999999999999999999999999999999999999999999999999
Javaには多倍長計算が出来るクラスがあるはずです。それで挑戦してみてください。
C言語には残念ながら存在しないので自分で組みましょう。桁数ずれと、繰り上がりに注意すれば大丈夫なはずです。
#include <stdio.h> #include <string.h> int main(){ char ina[82],inb[82],out[82]; int a,b,i;//カウンタ int carry;//キャリー scanf("%s",ina); scanf("%s",inb); a = strlen(ina); b = strlen(inb); a--; b--; carry=0; for(i=80;i>=0;i--){ int temp=carry; if(a>=0){ temp += ina[a--] -'0'; } if(b>=0){ temp += inb[b--] -'0'; } out[i] = temp%10 + '0'; carry = temp /10; } if(out[0] != '0'){ printf("overflow\n"); }else{ out[81] ='\0'; for(i=0;;i++){ if(out[i] != '0'){ printf("%s\n",&out[i]); break; } } } return 0; }
もっとスマートな方法もあると思います。でも、早く書ければどんなアルゴリズムでもいいのです。