结构体定义、初始化、工具类:
默认输入都是非负数。
不过只要稍作处理就能输入负数。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct Number
{
int n[1000];
int len;
Number()
{
memset(n,0,sizeof(n));
len=0;
}
};
//将输入的字符串转换成数组,逆序存储,便于计算
Number convert(char *s)
{
Number num;
int len=strlen(s);
num.len=len;
for(int i=0;i<len;i++)
{
num.n[i]=s[len-i-1]-'0';
}
return num;
}
// number1>=number2返回true,否则返回false
bool isBigger(Number number1,Number number2)
{
if(number1.len>number2.len) return true;
else if(number1.len<number2.len) return false;
else
{
//从数组最右端即数字最高位开始判断
for(int i=number1.len-1;i>=0;i--)
{
if(number1.n[i]>number2.n[i]) return true;
if(number1.n[i]<number2.n[i])return false;
}
}
return true;
}
//输出数字
void PrintNumber(Number number)
{
for(int i=number.len-1;i>=0;i--)
{
printf("%d",number.n[i]);
}
}
大整数加法:
Number Add(Number number1,Number number2)
{
Number res;
int TakeOver=0;
int len=max(number1.len,number2.len);
for(int i=0;i<len;i++)
{
int SingleSum=number1.n[i]+number2.n[i]+TakeOver;
TakeOver=SingleSum/10;
res.n[res.len++]=SingleSum%10;
}
if(TakeOver!=0) res.n[res.len++]=TakeOver;
return res;
}
大整数减法:
Number Minus(Number number1,Number number2)
{
Number res;
int len=max(number1.len,number2.len);
for(int i=0;i<len;i++)
{
if(number1.n[i]<number2.n[i]) //如果不够减向高位借
{
number1.n[i]+=10;
number1.n[i+1]--;
}
res.n[res.len++]=number1.n[i]-number2.n[i];
}
while(res.len>1&&res.n[res.len-1]==0) res.len--;//如果高位有多余的0去掉
return res;
}
完整代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct Number
{
int n[1000];
int len;
Number()
{
memset(n,0,sizeof(n));
len=0;
}
};
Number convert(char *s)
{
Number num;
int len=strlen(s);
num.len=len;
for(int i=0;i<len;i++)
{
num.n[i]=s[len-i-1]-'0';
}
return num;
}
Number Add(Number number1,Number number2)
{
Number res;
int TakeOver=0;
int len=max(number1.len,number2.len);
for(int i=0;i<len;i++)
{
int SingleSum=number1.n[i]+number2.n[i]+TakeOver;
TakeOver=SingleSum/10;
res.n[res.len++]=SingleSum%10;
}
if(TakeOver!=0) res.n[res.len++]=TakeOver;
return res;
}
Number Minus(Number number1,Number number2)
{
Number res;
int len=max(number1.len,number2.len);
for(int i=0;i<len;i++)
{
if(number1.n[i]<number2.n[i]) //如果不够减向高位借
{
number1.n[i]+=10;
number1.n[i+1]--;
}
res.n[res.len++]=number1.n[i]-number2.n[i];
}
while(res.len>1&&res.n[res.len-1]==0) res.len--;//如果高位有多余的0去掉
return res;
}
void PrintNumber(Number number)
{
for(int i=number.len-1;i>=0;i--)
{
printf("%d",number.n[i]);
}
}
// number1>=number2返回true,否则返回false
bool isBigger(Number number1,Number number2)
{
if(number1.len>number2.len) return true;
else if(number1.len<number2.len) return false;
else
{
//从数组最右端即数字最高位开始判断
for(int i=number1.len-1;i>=0;i--)
{
if(number1.n[i]>number2.n[i]) return true;
if(number1.n[i]<number2.n[i])return false;
}
}
return true;
}
int main()
{
char s1[1000],s2[1000];
scanf("%s%s",&s1,&s2);
Number num1=convert(s1);
Number num2=convert(s2);
PrintNumber(Add(num1,num2));
if(isBigger(num1,num2))
{
PrintNumber(Minus(num1,num2));
}
else
{
printf("-");
PrintNumber(Minus(num2,num1));
}
return 0;
}