[Atelier Blue アトリエブルー]Homeコンテストパソコン甲子園2003年本選>18問目

18問目(多倍長計算)

問題

ある国の借金は800兆近くあったりします。財部誠一 オフィシャルホームページ [借金時計]と、横道にそれました。

今回は多倍長計算を行いたいと思います。多倍長計算とはint型で扱うことが出来ないような大きな数、doubleで扱うことが出来ないような小数点以下数百桁とかという数を扱い計算です。

今回は80桁までの正の整数を2つ受け取りその数の和を出力してください。

与えられる数は10進数。結果が80桁を超える場合にはoverflowと出力してください。

なお、入力データはカレントディレクトリの018.datにあります。

入力


80桁以内の多桁数1(整数文字列)
80桁以内の多桁数2(整数文字列)

出力

入力の2つの数の和(整数文字列)

入力例


12345678901234567890123456789012345678901234567890123456789012345678901234567890
87654321098765432109876543210987654321098765432109876543210987654321098765432109

出力例

99999999999999999999999999999999999999999999999999999999999999999999999999999999

解き方例

Javaには多倍長計算が出来るクラスがあるはずです。それで挑戦してみてください。

C言語には残念ながら存在しないので自分で組みましょう。桁数ずれと、繰り上がりに注意すれば大丈夫なはずです。

ソースコード

お持ち帰り

C/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;
}


その他

もっとスマートな方法もあると思います。でも、早く書ければどんなアルゴリズムでもいいのです。


ページの一番上へ
前のページへ 一覧に戻る 次のページへ
初版2006-5-28
[Atelier Blue アトリエブルー]Homeコンテストパソコン甲子園2003年本選>18問目