- C20250070's blog
高精度学习笔记
- 2022-10-3 11:48:03 @
普通高精度就是把一个很大的数按 位分开储存。一般倒着储存(例如 是个位, 是十位……)。加减很简单。
代码:
#include <bits/stdc++.h>
using namespace std;
int main(){
int y[801]={0},e[801]={0},h[801]={0};
string s;
cin>>s;
int cnt=1;
for(int i=0;i<s.length();i++){
if(s[i]>='0'&&s[i]<='9'){
y[cnt++]=s[i]-'0';
}
}
cnt--;
cin>>s;
int k=1;
for(int i=0;i<s.length();i++){
if(s[i]>='0'&&s[i]<='9'){
e[k++]=s[i]-'0';
}
}
k--;
if(k<cnt){
int c=cnt-k;
for(int i=cnt;i>c;i--){
e[i]=e[i-c];
e[i-c]=0;
}
k=cnt;
}
else if(k>cnt) {
int c=k-cnt;
for(int i=k;i>c;i--){
y[i]=y[i-c];
y[i-c]=0;
}
cnt=k;
}
int j=0;
for(int i=cnt;i>=0;i--){
h[i]=(y[i]+j+e[i])%10;
j=(y[i]+j+e[i])/10;
}
bool b=false;
for(int i=0;i<=cnt;i++){
if(b||h[i]){
cout<<h[i];
b=true;
}
}
if(!b) cout<<0;
return 0;
}
乘法要计算好位数,第 位与第 位的乘积在第 位。
代码:
#include <bits/stdc++.h>
using namespace std;
int main(){
string s;
cin>>s;
int len1=0;
int a[2001]={0},b[2001]={0},c[4001]={0};
for(int i=0;i<s.length();i++){
if(s[i]>='0'&&s[i]<='9'){
a[++len1]=s[i]-'0';
}
}
cin>>s;
int len2=0;
for(int i=0;i<s.length();i++){
if(s[i]>='0'&&s[i]<='9'){
b[++len2]=s[i]-'0';
}
}
if(len1<len2){
int c=len2-len1;
for(int i=len2;i>c;i--){
a[i]=a[i-c];
a[i-c]=0;
}
len1=len2;
}
else if(len1>len2){
int c=len1-len2;
for(int i=len1;i>c;i--){
b[i]=b[i-c];
b[i-c]=0;
}
}
int w=0;
int j=0;
for(int i=len1;i>0;i--){
w++;
int p=w;
for(int jj=len1;jj>0;jj--){
c[4001-p]+=j+a[jj]*b[i];
j=c[4001-p]/10;
c[4001-p]%=10;
p++;
}
if(j>=1) c[4001-p]+=j;
j=0;
}
bool bb=false;
for(int i=0;i<4001;i++){
if(bb||c[i]>0){
bb=true;
cout<<c[i];
}
}
if(!bb) cout<<"0";
return 0;
}
除法就是把除数扩大 ,使除数与被除数一样位数,再减。然后再把除数不断除以 就好了。
代码:
#include<string>
#include<iostream>
using namespace std;
string a,c;
int b,i,d;
int main()
{
cin>>a>>b;
for (;i<a.length();i++)a[i]-=48;
for (i=0;i<a.length();i++)
c.push_back((d*10+a[i])/b+48),d=(d*10+a[i])%b;
for (i=0;c[0]==48;i++)c.erase(c.begin(),c.begin()+1);
cout<<c;
return 0;
}
压位高精就是每个数组都存储比较多的位数(例如 类型的数组就存储 位)。其实和普通高精差不多。这里就不放代码了。