高精度算法
高精度计算,也被称作大整数计算,运用了一些算法结构来支持更大整数间的运算。
高精度加法计算
#include<iostream>
#include<cstring>
using namespace std;
string s1,s2;//定义两个字符串存储输入的数字
int a[5000],b[5000],c[5000];
int la,lb,lc;//加数长度与和的长度
int main()
{
cin>>s1>>s2;//输入
la=s1.length();
lb=s2.length();
//转换类型,将数字顺序反转,存入数组a,b;
int i;
for(i=0;i<la;i++)
a[la-i]=s1[i]-'0';
for(i=0;i<lb;i++)
b[lb-i]=s2[i]-'0';
//计算和的长度
lc=max(la,lb)+1;
//计算
for(i=1;i<=lc;i++)
{
c[i]+=a[i]+b[i];//加数a的第i位与加数b的第i位相加,存入结果c的第i个元素
//进位
c[i+1]=c[i]/10;
c[i]=c[i]%10;
}
if(c[lc]==0&&lc>0)lc--;//去掉数字开头的0
for(i=lc;i>0;i--)//倒序输出
cout<<c[i];
}
高精度减法计算
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int flag=0;
string s1,s2;//定义两个字符串存储输入的数字
int a[5000],b[5000],c[5000];
bool com(string s1,string s2)//比较两个数大小
{
int a=s1.length();
int b=s2.length();
if(a!=b) return a>b;
int i;
for(int i=0;i<a;i++)
if(s1[i]!=s2[i]) return s1[i]>s2[i];
return true;
}
int main()
{
cin>>s1>>s2;
if(!com(s1,s2))//如果s1比s2小
{
flag=1;//标记结果为负数
swap(s1,s2);//交换被减数与减数的位置
}
int la=s1.length();
int lb=s2.length();
int i;
//转换类型,将数字顺序反转,存入数组a,b;
for(i=0;i<la;i++)
a[la-i]=s1[i]-'0';
for(i=0;i<lb;i++)
b[lb-i]=s2[i]-'0';
//确定结果的长度
int lc=max(la,lb);
//计算
for(i=1;i<=lc;i++)
{
//借位
if(a[i]<b[i])
{
a[i+1]--;
a[i]+=10;
}
c[i]=a[i]-b[i];
}
if(c[lc]==0&&lc>0)lc--;//去0
if(flag==1)printf("-");//如果结果是负数就输出‘-’
for(i=lc;i>0;i--)//输出
cout<<c[i];
}
高精度乘法计算
#include <iostream>
using namespace std;
string s1,s2;//定义两个字符串存储输入的数字
int a[5000],b[5000],c[5000];
int la,lb,lc;//加数长度与和的长度
int main()
{
cin>>s1>>s2;//输入
la=s1.length();
lb=s2.length();
//转换类型,将数字顺序反转,存入数组a,b;
int i;
for(i=0;i<la;i++)
a[la-i]=s1[i]-'0';
for(i=0;i<lb;i++)
b[lb-i]=s2[i]-'0';
//计算结果长度
lc=la+lb;
//计算
for(int i=1;i<=la;i++)
{
for(int j=1;j<=lb;j++)
{
c[i+j-1]+=a[i]*b[j];
c[i+j]=c[i+j-1]/10;
c[i+j-1]%=10;
}
}
if(c[lc]==0&&lc>0)lc--;//去开头的0
for(i=lc;i>0;i--) cout<<c[i];//输出
return 0;
}
高精度数除以低精度数
#include <iostream>
using namespace std;
string s1;//高精度数
int b/*低精度数*/,c[500],x,a[500],la,lc;
int main()
{
cin>>s1>>b;//输入
la=s1.length();//被除数长度
int i;
//转换类型
for(i=1;i<=la;i++)
a[i]=s1[i-1]-'0';
//使用试商法计算
for(i=1;i<=la;++i)
{
c[i]=(x*10+a[i])/b;
x=(x*10+a[i])%b;
}
lc=1;
//输出
while(c[lc]==0&&lc>0) lc--;
for(i=lc;i<=la;++i)
cout<<c[i];
return 0;
}