2131 - [数值问题]高精度加法

高精度加法(highplus/c/cpp) 

【问题描述】 

输入两个高精度正整数a和b(a,b的位数<=200),求这两个数的和

【输入格式】

<span>输入共两行,分别为a和b</span> 

<span>【输出格式】</span> 

<span>输出共一行,表示两个数的和。</span> 

<span>【输入样例1】&nbsp;</span><br />

1111111111111111111111111111111111
9999999999999999999999999999999999

<br />

<span>【输出样例1】</span> 

11111111111111111111111111111111110

<span style="line-height:1.5;"></span> 

<br />

题目输入

题目输出

输入/输出样例

题目输入


                

题目输出


                

提示

Const
    SIZE = 200+1;

Type
    hugeint = Record
        len : Integer;
        num : Array[1..SIZE] Of Integer;
    End;
var a,b:hugeint;
    s1,s2:string;
    i:integer;
procedure add(a, b : hugeint);
    Var
        i : Integer;
        ans : hugeint;
    Begin
        FillChar(ans.num, SizeOf(ans.num), 0);
        If a.len > b.len
            Then ans.len := a.len
            Else ans.len := b.len;
        For i := 1 To ans.len Do
            Begin
                ans.num[i] :=ans.num[i]+a.num[i]+b.num[i];
                ans.num[i + 1] := ans.num[i + 1] + ans.num[i] DIV 10;
                ans.num[i] := ans.num[i] MOD 10;
            End;
        If ans.num[ans.len + 1] > 0
            Then Inc(ans.len);
        for i:=ans.len downto 1 do write(ans.num[i]);
        writeln;
    End;


   procedure datain;
   begin
    assign(input,'highplus.in');  assign(output,'highplus.out');
    reset(input); rewrite(output);
    readln(s1);
    readln(s2);
    a.len:=length(s1);
    b.len:=length(s2);
    for i:=1 to a.len do  a.num[i]:=ord(s1[a.len-i+1])-ord('0');
    for i:=1 to b.len do  b.num[i]:=ord(s2[b.len-i+1])-ord('0');
   end;
   begin
    datain;
    add(a,b);
   close(input);close(output);
   end.

<br />

C++解答

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main(){
  char a1[200],b1[200];
  int a[200],b[200],c[200],lena,lenb,lenc;
  memset(a,0,sizeof(a));
  memset(b,0,sizeof(b));
  memset(c,0,sizeof(c));
  gets(a1);
  gets(b1);
  lena=strlen(a1);
  lenb=strlen(b1);
  for (int i=0;i<=lena-1;i++) a[lena-i]=a1[i]-48;
  for (int i=0;i<=lenb-1;i++) b[lenb-i]=b1[i]-48;
  lenc=lena>lenb?lena:lenb;
  for (int i=0;i<lenc;i++){
  	c[i]=c[i]+a[i]+b[i];
  	c[i+1]=c[i+1]+c[i] / 10;
  	c[i]=c[i]% 10;
  }
  if (c[lenc]>0) lenc+=1;
  for (int i=lenc-1;i>=0;i--) cout <<c[i];
  cout<<endl;
  return 0;
  
}

提示

Const
    SIZE = 200+1;

Type
    hugeint = Record
        len : Integer;
        num : Array[1..SIZE] Of Integer;
    End;
var a,b:hugeint;
    s1,s2:string;
    i:integer;
procedure add(a, b : hugeint);
    Var
        i : Integer;
        ans : hugeint;
    Begin
        FillChar(ans.num, SizeOf(ans.num), 0);
        If a.len > b.len
            Then ans.len := a.len
            Else ans.len := b.len;
        For i := 1 To ans.len Do
            Begin
                ans.num[i] :=ans.num[i]+a.num[i]+b.num[i];
                ans.num[i + 1] := ans.num[i + 1] + ans.num[i] DIV 10;
                ans.num[i] := ans.num[i] MOD 10;
            End;
        If ans.num[ans.len + 1] > 0
            Then Inc(ans.len);
        for i:=ans.len downto 1 do write(ans.num[i]);
        writeln;
    End;


   procedure datain;
   begin
    assign(input,'highplus.in');  assign(output,'highplus.out');
    reset(input); rewrite(output);
    readln(s1);
    readln(s2);
    a.len:=length(s1);
    b.len:=length(s2);
    for i:=1 to a.len do  a.num[i]:=ord(s1[a.len-i+1])-ord('0');
    for i:=1 to b.len do  b.num[i]:=ord(s2[b.len-i+1])-ord('0');
   end;
   begin
    datain;
    add(a,b);
   close(input);close(output);
   end.

<br />

时间限制 1 秒
内存限制 128 MB
讨论 统计
上一题 下一题