OpenJudge 2736 大整数减法 C++

链接地址:http://bailian.openjudge.cn/practice/2736/

题目:

总时间限制:
1000ms
内存限制:
65536kB
描述
求2个大的正整数相减的差
输入
第1行是测试数据的组数n,每组测试数据占2行,第1行是被减数a,第2行是减数b(a > b)。每组测试数据之间有一个空行,每行数据不超过100个字符
输出
n行,每组测试数据有一行输出是相应的整数差
样例输入
2
9999999999999999999999999999999999999
9999999999999

5409656775097850895687056798068970934546546575676768678435435345
1
样例输出
9999999999999999999999990000000000000
5409656775097850895687056798068970934546546575676768678435435344

思路:

套用大整数减法模板

代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <string>
 4 using namespace std;
 5 
 6 string sub(string s1,string s2)
 7 {
 8     int flag = 0;
 9     if(s1.length()<s2.length() || (s1.length()==s2.length() && s1 < s2))
10     {
11         flag = 1;
12         string temp=s1;
13         s1=s2;
14         s2=temp;
15     }
16 
17 
18     int i,j;
19     for(i=s1.length()-1,j=s2.length()-1;i>=0;i--,j--)
20     {
21         s1[i]=char(s1[i]-(j>=0?s2[j]-'0':0));   //注意细节
22         if(s1[i]-'0'<0)
23         {
24             s1[i]=char(s1[i] + 10);
25             s1[i-1]--;
26         }
27     }
28 
29     for(i = 0; i < s1.length(); i++)
30     {
31         if(s1[i] != '0') break;
32     }
33     if(i == s1.length()) i = s1.length()-1;
34     s1 = s1.substr(i);
35 
36     if(flag) s1 = "-" + s1;
37 
38     return s1;
39 }
40 
41 int main()
42 {
43     int n;
44     cin>>n;
45     string str1,str2;
46     while(n--)
47     {
48         cin>>str1>>str2;
49         cout<<sub(str1,str2)<<endl;
50     }
51     return 0;
52 }