c++高精度运算(减法)

本文介绍了如何使用C++进行高精度数值的加法和减法运算,通过模拟数组处理大数。主要内容包括字符数组的转换、位数比较、借位运算等,展示了加法和减法的详细步骤。程序中还考虑了负数的情况,并给出了完整的代码实现。
摘要由CSDN通过智能技术生成

c++高精度运算

由于c++不能进行位数过高的数据运算,所以要通过模拟数组来进行运算,首先是加法。通过char或string型数据输入字符来模拟数字的输入,数组下表对应的元素应当是处于同一位置的数字,下标相同的两个元素相加表示的既是结果。

需要注意的是
1.输入的是字符串,但是相加的时候必须要转换为数字,所以将字符型减去‘0’(0的字符)即可得到int型的数字。
2.输入的数组从最高位开始输入,不利于计算。

与加法类似,减法要注意的是借位运算。总体上分为这几个部分:
1.判断两个数谁大谁小的bool型函数。
2.主函数的输入部分(当做字符串输入)
3.如果减出来可能是负数则将大小数交换的部分(用flag把交换过的标出来)
4.将字符转换成数字的部分
5.同一位小数减大数要借位的部分
6.相减的部分
7.判断正负的部分
8.输出

 #include<bits/stdc++.h>
 using namespace std;
 char s1[10090],s2[10090],s3[10090];
 int a[10090],b[10090],c[10090];
 int flag=0;
 bool cmp(char s1[],char s2[])
 {
 	int u=strlen(s1),v=strlen(s2);  //u与v代表位数 
 	if(u!=v) return u>v;  //如果u与v不等,并且u 大于v则返回true 反之false
	for(int i=0;i<u;i++)
	{
		if(s1[i]!=s2[i]) return s1[i]>s2[i];  //如果某位不等,则判断谁大谁小 
	} 
	return true; 
 }
 int main()
 {
 	int la,lb,lc;
 	scanf("%s",s1);
 	scanf("%s",s2);
 	if(!cmp(s1,s2))		//如果s1<s2,交换两个数字,小数减大数不方便,直接交换加负号 
	 {
	 	flag=1;     //flag的作用是标记其为负数 
	 	strcpy(s3,s1);
		strcpy(s1,s2);
		strcpy(s2,s3);		//交换大小数字 
	} 
	la=strlen(s1);
	lb=strlen(s2);
	for(int i=0;i<la;i++)  //同加法一样对其位数 
		a[la-i]=s1[i]-'0';
	for(int i=0;i<lb;i++)
		b[lb-i]=s2[i]-'0';
	lc=max(la,lb);
	for(int i=1;i<=lc;i++)
	{
		if(a[i]<b[i])
		{
			a[i+1]--;
			a[i]=a[i]+10;
		}	
		c[i]=a[i]-b[i];	 
	 }

 while(c[lc]==0 && lc>1) lc--;
 if(flag==1) cout<<'-';
 for(int i=lc;i>0;i--)
	cout<<c[i];
 return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值