您的位置:首页 > 其它

高精度运算总结

2017-07-24 13:53 211 查看
高精度运算   以下只包含 输入的数为正整数

参考 oj   洛谷   

加:https://www.luogu.org/problem/show?pid=1601

减:https://www.luogu.org/problem/show?pid=2142

乘:https://www.luogu.org/problem/show?pid=1303

除:https://www.luogu.org/problem/show?pid=1480

大数加法

#include<bits/stdc++.h>
using namespace std;
int main(){
char a[10001],b[10001];
int a1[10001],b1[10001],c[100001]={0};
int j,k,l,i;
cin>>a>>b;
int len1=strlen(a);
int len2=strlen(b);
for(j=0;j<len1;j++){
a1[j]=a[j]-'0';
}
for(j=0;j<len2;j++){
b1[j]=b[j]-'0';
}
len1--; len2--; k=0;
while(len1!=-1&&len2!=-1){
l=a1[len1]+b1[len2]+c[k];
if(l>9){
c[k+1]++;
l=l-10;
}
c[k]=l;
k++; len1--; len2--;
}
while(len1!=-1){
c[k]=a1[len1]+c[k];
if(c[k]>9){
c[k]=c[k]-10;
c[k+1]++;
}
k++; len1--;
}
while(len2!=-1){
c[k]=b1[len2]+c[k];
if(c[k]>9){
c[k]=c[k]-10;
c[k+1]++;
}
k++; len2--;
}
if(c[k]!=0){
k++;
}
for(j=k-1;j>=0;j--){
cout<<c[j];
}
}


大数 减法

#include<bits/stdc++.h>
using namespace std;
int main(){
string  e,d,a,b;
int a1[10001],b1[10001],c[100001]={0};
int j,k,l,i,x=0,y=0;
cin>>e>>d;
int len1=e.size();
int len2=d.size();
if(len1>len2||(len1==len2&&e>=b)){a=e;b=d;}
else { i=len1; len1=len2; len2=i; a=d; b=e;  cout<<"-";}

for(j=0;j<len1;j++){
a1[j]=a[j]-'0';
}
for(j=0;j<len2;j++){
b1[j]=b[j]-'0'
4000
;
}
for(i=0;i<len1/2;i++) swap(a1[i],a1[len1-1-i]);
for(i=0;i<len2/2;i++) swap(b1[i],b1[len2-1-i]);      //前后交换位置 方便计算
for(j=0;j<len1;j++){
c[j]=a1[j]-b1[j];
// cout<<c[j]<<endl;
}
for(j=0;j<len1;j++){
if(c[j]<0){
c[j]+=10;
c[j+1]--;
}
}
for(j=len1-1;j>=0;j--){
if(c[j]>0) break;
}
for(;j>=0;j--){
x=1;
cout<<c[j];
}
if(x==0) cout<<"0";

return 0;
}


大数 乘法

#include<bits/stdc++.h>
using namespace std;
int main(){
string  e,d,a,b;
int a1[10001],b1[10001],c[100001]={0};
int j,k,l,i,x=0,y=0;
cin>>a>>b;
int len1=a.size();
int len2=b.size();
for(j=0;j<len1;j++){
a1[j]=a[j]-'0';
}
for(j=0;j<len2;j++){
b1[j]=b[j]-'0';
}
for(i=0;i<len1/2;i++) swap(a1[i],a1[len1-1-i]);
for(i=0;i<len2/2;i++) swap(b1[i],b1[len2-1-i]);
for(j=0;j<len1;j++){
for(k=0;k<len2;k++){
c[j+k]=c[j+k]+a1[j]*b1[k];
c[k+j+1]+=c[k+j]/10;
c[k+j]%=10;
//cout<<a[i]
}
}
l=len1+len2;
while(l>1&&c[l-1]==0) l--;
for(j=l-1;j>=0;j--)  cout<<c[j];

return 0;
}


大数 除法  恶心死我了

#include<bits/stdc++.h>
using namespace std;
int main(){
string  e,d,a,b;
int a1[10001],c[100001]={0};
int j,k,l,x=0,y=0;
long long b1,i;
cin>>a>>b1;
int len1=a.size();
int len2=b.size();
for(j=0;j<len1;j++){
a1[j]=a[j]-'0';
}
if(b1==0||a1[0]==0){
cout<<"0"<<endl;
return 0;
}
j=0; i=a1[0]; k=0;
while(j<len1){
if(i>=b1){
c[j]=i/b1;
i=i%b1;
i=i*10+a1[j+1];
}
else{
i=i*10+a1[j+1];
c[j]=0;
}
j++;
}
for(j=0;j<len1-1;j++) if(c[j]!=0) break;
for(;j<len1;j++)  cout<<c[j];
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: