简单的大数模板,包含加减乘除,注意,下面的函数都没有考虑首位为’-'的情况,所以要根据题目来修改
这里解释一下为什么存入结构的时候要逆着存储
因为用字符串读入数字的时候,数字的高位对应着字符串的低位,而数字的低位对应着字符串的高位,所以要倒着给结构体赋值,使其高低位相同。
#include<cstdio>
#include<string.h>
#include<algorithm>
using namespace std;
struct bign
{
int d[1000];
int len;
bign()
{
memset(d,0,sizeof(d));
len=0;
}
};
//字符数组转换到结构体中
bign change(char str[])
{
bign a;
a.len=strlen(str);
for(int i=0;i<a.len;i++)
{
a.d[i]=str[a.len-i-1]-'0';//逆着赋值
}
return a;
}
//比较大小
int compare(bign a,bign b)
{
//先判断长度,较长者较大
//长度相等则遍历 出现不相等时 较大数更大 (从高位往低位比)
if(a.len>b.len) return 1;//a大
else if(a.len<b.len) return -1;
else
{
for(int i=a.len-1;i>=0;i--)
{
if(a.d[i]>b.d[i]) return 1;
else if(a.d[i]<b.d[i]) return -1;
}
return 0;
}
}
//对于两个对象都是同符号的情况 都小于零则需要输出负号
bign add(bign a,bign b)
{
bign c;
int carry=0; //进位
//以较长的为界限
for(int i=0;i<a.len||i<b.len;i++)
{
//两个对应位与进位相加 ,当某一个达到上界时 后面都是加0 所以不影响结果
int temp=a.d[i]+b.d[i]+carry;
//个位数为改位的结果
c.d[c.len++]=temp%10;
//十位数为进位
carry=temp/10;
}
//如果最后进位不等于0,则再进一位
if(carry!=0)
{
c.d[c.len++]=carry;
}
return c;
}
//传入的应该是a>b
bign sub(bign a,bign b)
{
bign c;
//如果a<b 交换a 和 b 同时要输出负号
if(compare(a,b)==-1) swap(a,b);
for(int i=0;i<a.len||i<b.len;i++)
{
if(a.d[i]<b.d[i])
{
a.d[i+1]--;
a.d[i]+=10;
}
c.d[c.len++]=a.d[i]-b.d[i];
}
while(c.len-1>=1&&c.d[c.len-1]==0)
{
c.len--; //去掉高位的0,同时保留至少一位数
}
return c;
}
//高精度乘法 如果有负号 传入绝对值 最后输出负号
bign multi(bign a,int b)
{
bign c;
int carry=0;
for(int i=0;i<a.len;i++)
{
int temp=a.d[i]*b+carry;
c.d[c.len++]=temp%10; //取个位
carry=temp/10; //取高位部分进位
}
//如果最后还有进位
while(carry!=0)
{
c.d[c.len++]=carry%10;//取个位
carry/10;//再舍去一位
}
return c;
}
//高精度除法,r为余数
bign divide(bign a,int b,int &r)
{
bign c;
c.len=a.len;//被除的每一位和商的每一位都是对应的
for(int i=a.len-1;i>=0;i--)
{
r=r*10+a.d[i]; //和上一位余数组合成的临时数
if(r<b) c.d[i]=0; //不够除 该位为0
else//够除
{
c.d[i]=r/b;
r=r%b;
}
}
while(c.len-1>=1&&c.d[c.len-1]==0)
{
c.len--; //去掉多余的0 同时最多保留一位
}
return c;
}
void print(bign a)
{
for(int i=a.len-1;i>=0;i--)
{
printf("%d",a.d[i]);
}
}
int main()
{
char str1[1000],str2[1000];
scanf("%s%s",str1,str2);
bign a=change(str1);
bign b=change(str2);
// print(add(a,b));
print(sub(a,b));
}