C++----高精度计算

高精度加法

思路:

1.首先创建两个字符串a,b分别储存要进行加法的两个数字,此时为正序排列
2.创建三个数组a1,b1,c并初始化,两个用来储存逆序后的数字(因为根据加法列竖式时是从个位开始相加),一个用来储存逆序后对应位数相加的数,并后续逆序输出
3.输入a,b并将其逆序存入数组a1,b1中
4.将a1,b1相加并存入数组c中(此时仍为逆序)
5.判断是否有进位现象,以及是否有因最高位进位而导致数组长度发生变化,若存在,则数组长度+1
6.将数组c逆序输出

是不是很简单呢~

以下是两种不同的编码样例,但本质是一样的~

#include <iostream>
using namespace std; 
int main(){
	string a,b;//创建两个字符串
	int a1[201]={0},b1[201]={0},c[202]={0};//定义数组并初始化为0 数组长度根据实际情况变化
	getline(cin,a);
	getline(cin,b);//输入两个数 
	int s1=a.size();
	int s2=b.size();//得到两个数组的长度 
	for(int i=a1[i];i<s1;i++){
		a1[s1-i-1]=a[i]-'0'; 
	} 
	for(int i=b1[i];i<s2;i++){
		b1[s2-i-1]=b[i]-'0'; 
	} //字符串逆序存入数组 
	int len=s1;
	if(s2>s1){
		len=s2;
	}//循环次数取决于两个数组中较长的 
	for(int i=0;i<len;i++){
		c[i]=a1[i]+b1[i];
	}//将a1,b1数组相加并存入c中 
	for(int i=0;i<len;i++){
		if(c[i]>=10){
			c[i+1]+=c[i]/10;//进位 
			c[i]%=10;//保留进位后的数字 
		}
	}
	if(c[len]!=0)
		len++;//判断最高位是否发生进位 
	for(int i=len-1;i>=0;i--)
		cout<<c[i];//将数组c逆序输出 
		return 0;
}

相信你应该已经明白了吧
让我们来看第二个

#include <iostream>
using namespace std;   
string a,b;
int a1[501],b1[501],c1[501];
int main(){
	cin>>a>>b;
	//逆序存放并转成整数
	int la=a.size();
	for(int i=0;i<la;i++){
		a1[i]=a[la-i-1]-'0';	
	} 
	int lb=b.size();
	for(int i=0;i<lb;i++){
		b1[i]=b[lb-i-1]-'0';
	} //逆序存放
	//测试
//	for(int i=0;i<l;i++){
//		cout<<a1[i]; 
//	} 
	//模拟竖式
	int lc=0;
	int jw=0,i;//初始化进位为  0 
	for(i=0;i<max(la,lb);i++){
		c1[i]=a1[i]+b1[i]+jw;
		jw=c1[i]/10;
		c1[i]%=10; 
	} 
	if(jw>0){
		c1[i]=jw;
		lc=i+1;
	}else lc=i;
	cout<<"----------"<<endl;
	for(int i=lc-1;i>=0;i--){
		cout<<c1[i];
	}
	return 0;
} 

这回是不是明白了嘛?

今天我们就学到这里,要记得勤加练习哦~ (我也是),让我们共同努力吧~!

加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值