高精度加法【c++实现】-创新互联
其他高精度算法如下:
高精度减法【c++实现】
高精度乘法【c++实现】
高精度除法【c++实现】
——————————————————————————————
说在前面:
众所周知 int,long,long long 的能力是有限制的,具体见下表:
然而现实中的数字是可以非常大的,大到 long long 都装不下,这个时候如果对两个这样的数字进行加减乘除显然是 long long 都无能为力了。欸!那该怎么办呢?
这时候,就到了我们的高精度算法发光发热的时候啦!
这里先说高精度加法的实现:
首先要明确的一点是,高精度加法就是在模拟现实中加法计算的方法而已,用数组的一位存储数字的一位,把两个数字一位一位的相加,当两位数相加再加进位的数字大于等于10的时候就要进位,同时当前位只保留个位数,保证每一位只有一个数字。(可以自己列个竖式感受一下easy)
需要解决的一些问题:
例如:976+515=1491
如果像这个样子存两个数子的话就会发现一个问题,因为我们要保证数组的每一位只有一个数字,那ans的进位没有地方放了啊(总不能不要了吧)
再例如:976+5151=6127
这种情况下,因为 num1 和 num2 没有对齐位,所以相加的时候也不好处理 num1 的哪一位加 num2 的哪一位。
解决方法:
976+5151=6127
于是乎,我们就要把 num1 和 num2 倒着存进数组里,这样就顺利的解决了对齐问题和进位问题!!【鼓掌】【鼓掌】【鼓掌】
那么现在进入正题:
思路:
- 用字符数组接受两个数字(这样子数字就变成了一位一位的了)
- 将字符数组倒序转为整形数组进行运算(字符相加可不太好做)
- 将结果倒序输出就是答案啦
#include#includeusing namespace std;
int main(){int num1[520]={0},num2[520]={0},ans[520]={0};//自己根据需要定义整形数组的大小
int temp,i,j; //temp是用来存进位的数字的
char num1c[520]={0},num2c[520]={0};//接受数字时用的字符数组
cin>>num1c>>num2c; //接收两个数字到字符数组(这是还是正向的)
int len1=strlen(num1c); //计算num1的长度
int len2=strlen(num2c); //计算num2的长度
//将两个字符型的数字 倒序存到对应整型数组里 (记得减字符‘0’)
//数字低位---------------->数字高位
for(i=len1-1;i>=0;i--){num1[len1-1-i]=num1c[i]-'0';
}
for(i=len2-1;i>=0;i--){num2[len2-1-i]=num2c[i]-'0';
}
//计算两个数字的和
//循环的时候可以全部过一遍,也可以根据两个数字的位数和进位来决定(循环次数会少一些)
//但我们要充分相信计算机的能力(bushi)
for(i=0;i<=520;i++){ans[i]=num2[i]+num1[i]+temp;//求和
temp=ans[i]/10;//ans[i]如果大于10就进位
ans[i]%=10;//ans[i]取个位数
}
len2++;//最高位加 1 防止漏掉最后的进位
//当数字总位数大于1时,去掉开头的0
//不要全都去掉哦,不然0+0就没有输出了
while(ans[len2]==0&&len2>0) len2--;
//倒序打印出来就是答案了!!!!
for(i=len2;i>=0;i--){cout<
结果发现非常成功!!!【撒花】【撒花】【撒花】
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
网页名称:高精度加法【c++实现】-创新互联
分享URL:http://scyanting.com/article/dijsii.html