13.大整数/高精度运算重难点剖析
1.大整数的储存
如何储存:
struct bigshu{ //定义一个结构体 来储存大整数
int d[1000];
int len;
bigshu() //构造函数 →初始化
{
memset(d,0,sizeof(d));
len=0;
}
};
如何赋值:
因为整数的高位存在数组的高位,整数的低位存在数组的低位,运算时都是从低位向高位枚举,故逆向输入,与实际思维相符合!
bigshu fuzhi(char x[]) //定义赋值函数
{
bigshu a;
a.len=strlen(x);
for(int i=0;i<a.len;i++)
{
a.d[i]=x[a.len-i-1]-'0'; //逆向输入
}
return a;
}
如何比较两个大整数的大小
int bijiao(bigshu a,bigshu b) //a大 相等 a小 分别返回 1 0 -1
{
if(a.len>b.len) return 1; //先比较长度
else if(a.len<b.len) return -1; //先比较长度
else //长度相等再来比较个位数的大小 从高位开始
{
for(int i=a.len-1;i>=0;i--) //从高位开始枚举
{
if(a.d[i]>b.d[i]) return 1;
else if(a.d[i]<b.d[i]) return -1;
}
return 0;
}
}
如何输出
void print(bigshu a)
{
for(int i=a.len-1;i>=0;i--)
{
cout<<a.d[i]; //从高位向低位输出
}
}
下面是例子【只适用于非负数运算-有待改进】
高精度加法
#include <bits/stdc++.h>
using namespace std;
struct bigshu{
int d[1000];
int len;
bigshu() //构造函数 →初始化
{
memset(d,0,sizeof(d));
len=0;
}
};
bigshu fuzhi(char x[]) //将数组存入结构统一
{
bigshu a;
a.len=strlen(x);
for(int i=0;i<a.len;i++)
{
a.d[i]=x[a.len-i-1]-'0'; //逆向赋值
}
return a;
}
bigshu jiafa(bigshu a,bigshu b) //高精度加法
{
bigshu c;
int carry=0;
for(int i=0;i<a.len||i<b.len;i++)
{
int temp=a.d[i]+b.d[i]+carry;
c.d[c.len++]=temp%10;
carry=temp/10;
}
if(carry)
{
c.d[c.len++]=carry;
}
return c;
}
void print(bigshu a) //输出函数
{
for(int i=a.len-1;i>=0;i--)
{
cout<<a.d[i];
}
}
int main()
{
char x1[1000]={},x2[1000]={};
cin>>x1>>x2;
bigshu a,b;
a=fuzhi(x1);
b=fuzhi(x2);
print(jiafa(a,b));
return 0;
}
高精度减法
#include <bits/stdc++.h>
using namespace std;
struct bigshu{
int d[1000];
int len;
bigshu() //构造函数 →初始化
{
memset(d,0,sizeof(d));
len=0;
}
};
bigshu fuzhi(char x[])
{
bigshu a;
a.len=strlen(x);
for(int i=0;i<a.len;i++)
{
a.d[i]=x[a.len-i-1]-'0'; //逆向赋值
}
return a;
}
int bijiao(bigshu a,bigshu b) //a大 相等 a小 分别返回 1 0 -1
{
if(a.len>b.len) return 1;
else if(a.len<b.len) return -1;
else
{
for(int i=a.len-1;i>=0;i--)
{
if(a.d[i]>b.d[i]) return 1;
else if(a.d[i]<b.d[i]) return -1;
}
return 0;
}
}
bigshu jianfa(bigshu a,bigshu b)
{
bigshu c;
for(int i=0;i<a.len||i<b.len;i++)
{
if(a.d[i]<b.d[i])
{
a.d[i+1]--;
a.d[i]+=10;
}
c.d[c.len++]=a.d[i]-b.d[i];
}
while(c.len-1>=1&&c.d[c.len-1]==0) c.len--;
return c;
}
void print(bigshu a)
{
for(int i=a.len-1;i>=0;i--)
{
cout<<a.d[i];
}
}
int main()
{
char x1[1000]={},x2[1000]={};
cin>>x1>>x2;
bigshu a=fuzhi(x1),b=fuzhi(x2);
int psd=bijiao(a,b);
if(psd==1) print(jianfa(a,b));
else if(psd==0) cout<<0;
else if(psd==-1)
{
cout<<"-";
print(jianfa(b,a));
}
return 0;
}
高精度与低精度乘法
#include <bits/stdc++.h>
using namespace std;
struct bigshu{
int d[1000];
int len;
bigshu() //构造函数 →初始化
{
memset(d,0,sizeof(d));
len=0;
}
};
bigshu fuzhi(char x[])
{
bigshu a;
a.len=strlen(x);
for(int i=0;i<a.len;i++)
{
a.d[i]=x[a.len-i-1]-'0'; //逆向赋值
}
return a;
}
bigshu chengfa(bigshu a,int b)
{
bigshu c;
int carry=0;
for(int i=0;i<a.len;i++)
{
int temp=a.d[i]*b+carry;
c.d[c.len++]=temp%10;
carry=temp/10;
}
while(carry)
{
c.d[c.len++]=carry%10;
carry/=10;
}
return c;
}
void print(bigshu a)
{
for(int i=a.len-1;i>=0;i--)
{
cout<<a.d[i];
}
}
int main()
{
char x1[1000]={};
int x2;
cin>>x1>>x2;
bigshu a=fuzhi(x1);
print(chengfa(a,x2));
return 0;
}
高精度与低精度除法
#include <bits/stdc++.h>
using namespace std;
struct bigshu{
int d[1000];
int len;
bigshu() //构造函数 →初始化
{
memset(d,0,sizeof(d));
len=0;
}
};
bigshu fuzhi(char x[])
{
bigshu a;
a.len=strlen(x);
for(int i=0;i<a.len;i++)
{
a.d[i]=x[a.len-i-1]-'0'; //逆向赋值
}
return a;
}
bigshu chufa(bigshu a,int b,int& r)
{
bigshu c;
c.len=a.len;
for(int i=a.len-1;i>=0;i--)
{
r=r*10+a.d[i]; //和上一位的余数结合
if(r<b) c.d[i]==0;
else
{
c.d[i]=r/b;
r%=b;
}
}
while(c.len-1>=1&&c.d[c.len-1]==0) c.len--;
return c;
}
void print(bigshu a)
{
for(int i=a.len-1;i>=0;i--)
{
cout<<a.d[i];
}
}
int main()
{
char x1[1000]={};
int x2=0,yu=0;
cin>>x1>>x2;
bigshu a=fuzhi(x1);
print(chufa(a,x2,yu));
}