超出long long 范围,使用数组储存。
用算法模拟竖式加减乘除——理解加减乘除的规律
基本操作【写函数】
数据存储
输入:string型
计算:char型数组(value-48)
-
输入为char=value+48 乘除法无法正确计算char
-
输出直接输出ascii值
-
是否需要倒置 加乘存在进位【倒置】 减除存在借位
-
reverse函数:可以实现反转【头文件:algorithm】字符,vector,数字
-
reverse(a.begin(),a.end());
-
reverse_copy(a.begin(),a.end(),b.begin());
string a;char b[2000];
cin>>a;
for(int i=1;i<=a.size();i++)
{
a [i]=b[a.size()-i];//实现反转
}
'''
'''
char a,b[2000];
int i=1;
while((cin>>a)!='\n'){
b[i]=a;
i++;
}
char的有效长度就为i;
进位计算【大于等于10】
a[i+1]往前进a/10;a[i]保存a%10
借位计算【i<j】
a[i]=0;a[i-1]+=a[i]*10;
输出位数
-
检查0的位置【时间长】
-
另外储存进位的数:
x=a[i]/10;
在结尾
a[len+1]=x;
- 对于加法:循环到len++;判断首位是否为0;
具体算法
(1)高精度加法:
每位相加后 注意进位
-a+b【反转】
for(int i=1;i<=n;i++)
{
a[i]+=b[i];
x=a[i]/10;
a[i]%=10;
}
a[i+1]+=x;
(2)高精度减法
借位【不需要反转】
-a-b
100-78
for(int i=1;i<=n;i++)
{
if(a[i]>=b[i])
a[i]-=b[i];
else
{
a[i]=a[i]+10-b[i];
a[i++]--;
}
}
(3)高精度乘法
-a*b c
for(int i=1;i<=a.size();i++)
{
for(int j=1;j<=b.size();j++)
{
c[i+j-1]+=a[i]*a[j]+x;
x=c[i+j-1]/10;
c[i+j-1]%=10;
}
c[i+a.size()]+=x;
}
(4)高精度除法
-a/b