2132 - [数值问题]高精度减法

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

【问题描述】 

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

【输入格式】

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

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

<span>输出共一行,表示两个数的差,若a小于b,则先输出负号。</span> 

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

9999999999999999999999999999999999

<span style="font-family:'Microsoft Yahei';font-size:14px;line-height:21px;background-color:#F5F5F5;">1111111111111111111111111111111111</span> 

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

8888888888888888888888888888888888

题目输入

题目输出

输入/输出样例

题目输入


                

题目输出


                

提示

Const
    SIZE = 200;

Type
    hugeint = Record
        len : Integer;
        num : Array[1..SIZE] Of Integer;
    End;
var a,b:hugeint;
    s1,s2:string;
    i:integer;
Function over(a, b : hugeint) : integer;
    Var
        i : Integer;
    Begin
        If (a.len>b.len) Then
            Begin
                over :=1 ;
                Exit;
            End;
        If a.len < b.len Then
            Begin
                over := 2;
                Exit;
            End;
        For i := a.len DownTo 1 Do
            Begin
                If a.num[i] > b.num[i] Then
                    Begin
                        over := 1;
                        Exit;
                    End;
                If a.num[i] < b.num[i] Then
                    Begin
                        over := 2;
                        Exit;
                    End;
            End;
        over := 3;
    End;

procedure minus(a,b:hugeint);
  var
   i:longint;
   t,ans:hugeint;
  begin
fillchar(ans.num,sizeof(ans.num),0);
 if over(a,b)=2 then
   begin
    write('-');
    t:=a;a:=b;b:=t;
   end;
 if over(a,b)=3 then begin writeln(0);exit;end;
 ans.len:=a.len;
 for i:=1 to ans.len do ans.num[i]:=a.num[i]-b.num[i];
 for i:=1 to ans.len do
  if ans.num[i]<0 then
   begin
     dec(ans.num[i+1]);
     inc(ans.num[i],10);
   end;
 while (ans.len>1)and(ans.num
 [ans.len]=0) do dec(ans.len);
 for i:=ans.len downto 1 do write(ans.num[i]);
 writeln;
end;

   procedure datain;
   begin
    assign(input,'highminus.in');  assign(output,'highminus.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;
    minus(a,b);
   close(input);close(output);
   end.

<br />

<br />

C++解答

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main(){
	int a[256],b[256],c[256],lena,lenb,lenc,i;
	char s[256],s1[256],s2[256];
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	memset(c,0,sizeof(c));
	gets(s1);
	gets(s2);
	if(strlen(s1)<strlen(s2)||(strlen(s1)==strlen(s2)&&strcmp(s1,s2)<0)){
		strcpy(s,s1);
		strcpy(s1,s2);
		strcpy(s2,s);
		cout <<"-";
	}
	lena=strlen(s1); lenb=strlen(s2); 
	for(i=0;i<=lena-1;i++) a[lena-i]=s1[i]-48;
	for(i=0;i<=lenb-1;i++) b[lenb-i]=s2[i]-48;
	for(i=1;i<=lena;i++){
		c[i]=a[i]-b[i];
		if (c[i]<0){
			c[i]+=10;
			c[i+1]--;
		} 
	}
	lenc=lena+1;
	while (c[lenc]==0) lenc--;
	for(i=lenc;i>=1;i--) {
	cout<<c[i];}
	cout<<endl;
	return 0;  
	
}

提示

Const
    SIZE = 200;

Type
    hugeint = Record
        len : Integer;
        num : Array[1..SIZE] Of Integer;
    End;
var a,b:hugeint;
    s1,s2:string;
    i:integer;
Function over(a, b : hugeint) : integer;
    Var
        i : Integer;
    Begin
        If (a.len>b.len) Then
            Begin
                over :=1 ;
                Exit;
            End;
        If a.len < b.len Then
            Begin
                over := 2;
                Exit;
            End;
        For i := a.len DownTo 1 Do
            Begin
                If a.num[i] > b.num[i] Then
                    Begin
                        over := 1;
                        Exit;
                    End;
                If a.num[i] < b.num[i] Then
                    Begin
                        over := 2;
                        Exit;
                    End;
            End;
        over := 3;
    End;

procedure minus(a,b:hugeint);
  var
   i:longint;
   t,ans:hugeint;
  begin
fillchar(ans.num,sizeof(ans.num),0);
 if over(a,b)=2 then
   begin
    write('-');
    t:=a;a:=b;b:=t;
   end;
 if over(a,b)=3 then begin writeln(0);exit;end;
 ans.len:=a.len;
 for i:=1 to ans.len do ans.num[i]:=a.num[i]-b.num[i];
 for i:=1 to ans.len do
  if ans.num[i]<0 then
   begin
     dec(ans.num[i+1]);
     inc(ans.num[i],10);
   end;
 while (ans.len>1)and(ans.num
 [ans.len]=0) do dec(ans.len);
 for i:=ans.len downto 1 do write(ans.num[i]);
 writeln;
end;

   procedure datain;
   begin
    assign(input,'highminus.in');  assign(output,'highminus.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;
    minus(a,b);
   close(input);close(output);
   end.

<br />

<br />

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