高精度算法,旨在处理 一般数据类型承载不了的体量
可以分为输入,处理,输出三个方面的研究。
对输入部分:可以采取string类型记录数据,或字符数组。
对处理部分:可以采用string相关的函数,或对每一位字符处理精细处理。
对输出部分:输出位string 类型;或按要求取模输出;或字符数组。
P1. 洛谷1601高精度正数加法为例
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int main()
{
string numa,numb;
cin>>numa>>numb;
int bitsnum=(numa.length()>=numb.length()?numa.length()+1:numb.length()+1);//length()直接得到有效个数
int paddingnuma=bitsnum-numa.length();int paddingnumb=bitsnum-numb.length();
numa.insert(0,paddingnuma,'0');
numb.insert(0,paddingnumb,'0');//insert(0,a,字符b)即在某个0位置前添加a个字符b
reverse(numa.begin(),numa.end());
reverse(numb.begin(),numb.end());//string类中,输入abc,则a为第0位,考虑用reverse翻转
char* calc=new char[bitsnum];
int carry=0;
for(int i=0;i<bitsnum;i++)
{
calc[i]=char((numa[i]-48+numb[i]-48+carry)%10+48);
carry=(numa[i]-48+numb[i]-48)/10;
}
int beginspot=bitsnum-1;
while(calc[beginspot]=='0') beginspot--;
for(int i=beginspot;i>=0;i--) cout<<calc[i];
return 0;
}
P2. 高精度乘法
注意我没有用char存储结果,因为我采用最终顺一遍result数组的方式,char数组存储可能越界成赋值。这样做稍微显得不自然。
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main()//注意,使用本算法时,char数组无法用来一次性装结果,需要int存储最终结果
{
string a,b;cin>>a>>b;
int lengtha=a.length();int lengthb=b.length();
int* result=new int[lengtha+lengthb+1]{0};
int adda=lengthb;int addb=lengtha;
a.insert(0,lengthb,'0');
b.insert(0,lengtha,'0');
//cout<<a<<endl<<b<<endl;
int totalnums=lengtha+lengthb-1;
for(int i=totalnums;i>0;i--)
{
for(int j=totalnums;j>0;j--)
{
int carry=(a[i]-'0')*(b[j]-'0')/10;
int resultp=((a[i]-'0')*(b[j]-'0'))%10;
result[i-(totalnums-j)]+=resultp;
result[i-(totalnums-j)-1]+=carry;
}
}
for(int i=totalnums;i>0;i--)
{
//cout<<int(result[i])<<" ";
int finalresult=result[i]%10;
int finalcarry=result[i]/10;
result[i]=finalresult;
result[i-1]+=finalcarry;
}
int beginspot=0;
while(result[beginspot]==0) beginspot++;
for(int i=beginspot;i<totalnums+1;i++) cout<<result[i];
return 0;
}