**
大数相减
**
序号:#3 难度:有挑战 时间限制:1000ms 内存限制:100M
描述
两个长度超出常规整形变量上限的大数相减,请避免使用各语言内置大数处理库,如 Java.math.BigInteger 等。
输入
有 N 行测试数据,每一行有两个代表整数的字符串 a 和 b,长度超过百位。规定 a>=b,a, b > 0。 测试结果可以用 linux 小工具 bc进行测试是否正确。
输出
返回表示结果整数的字符串。
输入样例
1231231237812739878951331231231237812739878951331231231237812739878951331231231237812739878951331231231237812739878951331231231237812739870-89513312312312378127398789513312312312378127398789513312312312378127398789513
1231231237812739878951331231231237812739878951331231231237812739878951331230000000000000000000000001-331231231237812739878951331231231
输出样例
1231231237812739878951331231231237812739878951331231231237812650365639018918853110413950365639018918853110413950365639018918853110413950357
1231231237812739878951331231231237812739878951331231231237812739878620099998762187260121048668768770
#include <stdio.h>
#include <cstdio>
#include <string>
#include <iostream>
#include <vector>
#include <bits/stdc++.h>
#include <algorithm>
using namespace std;
void BigSub(string a,string b)
{
if(a==b)
{
cout<<"0"<<endl;
return;
}
int singnal=0;
int len1=a.size();
int len2=b.size();
if(len1<len2 || len1==len2 && a<b)
{
string c=a;
a=b;
b=c;
singnal=1;
}
int i,n=len1-len2;
for(i=len2-1;i>=0;i--)
a[len1-1-i]='0'+a[len1-1-i]-b[len2-1-i];
for(i=len1-1;i>=0;i--)
{
if(a[i]<'0')
{
a[i] +=10;
a[i-1]--;
}
}
i=0;
while('0'==a[i])
i++;
a.erase(0,i);
if(singnal)
a='-'+a;
cout<<a<<endl;
}
char * right(char *dst,char *src, int n)
{
char *p = src;
char *q = dst;
int len = strlen(src);
if(n>len) n = len;
p += (len-n);
while(*(q++) = *(p++));
return dst;
}
int main()
{
char str1[1000],str2[1000],str[10000];
while(cin>>str){
int len=strlen(str);
int k=0;
for(int i=0;i<len;i++)
{
if(str[i]=='-')
k=i;
}
strncpy(str1,str,k);
right(str2,str,len-k-1);
BigSub(str1,str2);
}
return 0;
}