您的位置:首页 > 其它

整数高精度计算

2016-10-01 21:30 302 查看
加法:

#include <iostream>
#include <cstring>
using namespace std;
int main(){
char aa[100],bb[100];int a[100],b[100],c[100];
int lena,lenb,lenc,i,x;
memset(a,0,sizeof(a));memset(b,0,sizeof(b));memset(c,0,sizeof(c));
gets(aa);gets(bb);
lena = strlen(aa);lenb = strlen(bb);
for(i=0;i<lena;i++)a[lena-i]=aa[i]-48;
for(i=0;i<lenb;i++)b[lenb-i]=bb[i]-48;
lenc=1;x=0;
while(lenc<=lena || lenc<=lenb){
c[lenc]=a[lenc]+b[lenc]+x;
x=c[lenc]/10;
c[lenc]%=10;
lenc++;
}
c[lenc]=x;
if(c[lenc]==0)lenc--;
for(i=lenc;i>=1;i--)cout<<c[i];
cout<<endl;

return 0;
}


总结:

1、字符串输入,逆序存储;

2、逐位相加,保留余数,向前进位;

减法:

#include <iostream>
#include <cstring>
using namespace std;
int main(){
int a[256],b[256],c[256];
char t[256],t1[256],t2[256];
int i,lena,lenb,lenc;
memset(a,0,sizeof(a));memset(b,0,sizeof(b));memset(c,0,sizeof(c));
gets(t1);gets(t2);
if((strlen(t1)<strlen(t2)) || (strlen(t1)==strlen(t2) && strcmp(t1,t2)<0)){
strcpy(t,t1);
strcpy(t1,t2);
strcpy(t2,t);
cout<<"-";
}
lena=strlen(t1);lenb=strlen(t2);
for(i=0;i<lena;i++)a[lena-i]=t1[i]-48;
for(i=0;i<lenb;i++)b[lenb-i]=t2[i]-48;
i=1;
while(i<=lena || i<=lenb){
if(a[i]<b[i]){
a[i]+=10;
a[i+1]--;
}
c[i]=a[i]-b[i];
i++;
}
lenc=i;
while(c[lenc]==0 && lenc>1)lenc--;
for(i=lenc;i>=1;i--)cout<<c[i];
cout<<endl;

return 0;
}


总结:

1、字符输入,逆序存储;

2、保证被减数大于减数;

3、去除高位0;

乘法:

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int main(){
char t1[256],t2[256];int a[256],b[256],c[256];
int x,i,j;int lena,lenb,lenc;
memset(a,0,sizeof(a));memset(b,0,sizeof(b));memset(c,0,sizeof(c));
gets(t1);gets(t2);
lena=strlen(t1);lenb=strlen(t2);
for(i=0;i<lena;i++)a[lena-i]=t1[i]-48;
for(i=0;i<lenb;i++)b[lenb-i]=t2[i]-48;
for(i=1;i<=lena;i++){
x=0;
for(j=1;j<=lenb;j++){
c[i+j-1]=a[i]*b[j]+x+c[i+j-1];
x=c[i+j-1]/10;
c[i+j-1]%=10;
}
c[i+lenb]=x;
}
lenc=lena+lenb;
while(c[lenc]==0 && lenc>1)lenc--;
for(i=lenc;i>=1;i--)cout<<c[i];
cout<<endl;

return 0;
}


c[i+j-1]=a[i]*b[j]+x+c[i+j-1]

除法(高精除低精)

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int main(){
char t[256];int a[256],c[256];
int b,lena,lenc,i,x;
memset(a,0,sizeof(a));memset(c,0,sizeof(c));
gets(t);cin>>b;
lena=strlen(t);
for(i=0;i<lena;i++)a[i+1]=t[i]-48;//正序存储,从1开始
x=0;
for(i=1;i<=lena;i++){
c[i]=(x*10+a[i])/b;
x=(x*10+a[i])%b;
}
lenc=1;
while(c[lenc]==0 && lenc<lena)lenc++;
for(i=lenc;i<=lena;i++)cout<<c[i];
cout<<endl;

return 0;
}


除法(高精除高精)

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int compare(int a[],int b[]);
void jian(int a[],int b[]);
int a[256],b[256],c[256];
int main(){
char s1[256],s2[256];int t[256];int i,j;
memset(a,0,sizeof(a));memset(b,0,sizeof(b));memset(c,0,sizeof(c));
gets(s1);gets(s2);
a[0]=strlen(s1);b[0]=strlen(s2);c[0]=a[0]-b[0]+1;
for(i=0;i<a[0];i++)a[a[0]-i]=s1[i]-48;
for(i=0;i<b[0];i++)b[b[0]-i]=s2[i]-48;
for(i=c[0];i>0;i--){
memset(t,0,sizeof(t));
for(j=1;j<=b[0];j++)t[j+i-1]=b[j];
t[0]=b[0]+i-1;
while(compare(a,t)>=0){c[i]++;jian(a,t);}
}
while(c[0]>0 && c[c[0]]==0)c[0]--;
if(c[0]==0){
cout<<0<<endl;
}else{
for(i=c[0];i>=1;i--)cout<<c[i];
cout<<endl;
}
return 0;
}
int compare(int a[],int b[]){
int i;
if(a[0]>b[0])return 1;
if(a[0]<b[0])return -1;
for(i=a[0];i>0;i--){
if(a[i]>b[i])return 1;
if(a[i]<b[i])return -1;
}
return 0;
}
void jian(int a[],int b[]){
int i,flag;
flag = compare(a,b);
if(flag==0){a[0]=0;return;}
if(flag==1){
for(i=1;i<=a[0];i++){
if(a[i]<b[i]){a[i+1]--;a[i]+=10;}
a[i]=a[i]-b[i];
}
}
while(a[0]>0 && a[a[0]]==0)a[0]--;
return;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: