3115 高精度练习之减法

题目描述 Description

给出两个正整数A和B,计算A-B的值。保证A和B的位数不超过500位。

 

输入描述 Input Description

读入两个用空格隔开的正整数

 

输出描述 Output Description

输出A-B的值

 

样例输入 Sample Input

3 12

样例输出 Sample Output

-9

 

数据范围及提示 Data Size & Hint

两个正整数的位数不超过500位

 

首先判断结果正负,保留符号,将较大的值放在被减数。然后模拟减法过程,注意借位运算。

 

附AC代码:

 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 
 5 const int MAX=510;
 6 int a[MAX],b[MAX],c[MAX];
 7 
 8 void ex(char *s1,char*s2){//交换函数 
 9     char temp[MAX];
10     strcpy(temp,s1);
11     strcpy(s1,s2);
12     strcpy(s2,temp);
13 }
14 
15 int main(){
16     char al[MAX],bl[MAX];
17     int sign,t;
18     cin>>al>>bl;
19     memset(a,0,sizeof(a));
20     memset(b,0,sizeof(b));
21     memset(c,0,sizeof(c));
22     int lena=strlen(al);
23     int lenb=strlen(bl);
24     if(lena<lenb){//决定符号的正负 
25         sign=-1;
26         ex(al,bl);//结果为负时保存负号,两数交换 
27         t=lena;
28         lena=lenb;
29         lenb=t;
30     }
31     else if(lena==lenb){
32         for(int i=0;i<lena;i++){//长度相等时从最大位到最小位依次比较 
33             if(al[i]<bl[i]){
34                 sign=-1;
35                 ex(al,bl);
36                 break;
37             }
38             else if(al[i]>bl[i]){
39                 sign=1;
40                 break;
41             }
42             else
43             sign=1;
44         }
45     }
46     else
47     sign=1;
48     
49     for(int i=0;i<lena;i++){//反向输入数组 
50         a[lena-i]=al[i]-48;
51     }
52     for(int i=0;i<lenb;i++){
53         b[lenb-i]=bl[i]-48;
54     }
55     for(int i=1;i<=lena;i++){//模拟减法运算 
56         if(a[i]>=b[i]){
57             c[i]=a[i]-b[i];
58         }
59         else{
60             t=i+1;
61             a[t]-=1;
62             c[i]=a[i]+10-b[i];
63         }
64     }
65     if(c[lena]==0)//防止首位为0 
66     lena--;
67     cout<<c[lena]*sign;//输出首位和符号 
68     for(int i=lena-1;i>=1;i--){//依次输出各位的值 
69         cout<<c[i];
70     }
71     cout<<endl;
72     return 0;
73 }

 

posted @ 2016-07-15 11:04  Kiven#5197  阅读(336)  评论(0编辑  收藏  举报