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;
}