定义:存储不能用long long甚至__int128存储的大数
操作方法:手动计算(就是给你一道题问你咋算)
1:用数组存
那要看有几位 那就交给a[0]这个不用的空间
代码:
void read_s(string s,int a[]){//字符串数-->高精度
a[0]=s.size();//长度,也可以说 s.length()
for(int i=1;i<=s[0];++i) //每一位
a[i]=s[a[0]-i]-'0'; // 存倒数第i位,在用ASCLL码的方法变成整形
}
2:会输入得会输出
void print(int a[]){//输出a[]
for(int i=a[0];i>=1;--i)//要先输出高位
cout<<a[i];
puts("");//换行,根据条件
}
3.单精度变高精度(可以做计算)
首先要用到取每一位的方法
while(n){//只要会有数
int ge=n%10;//最后一位
n/=10;//把最后一位“砍”了
}
其实也可以写成
for(;n;n/=10){//用for来做
int ge=n%10;//个位
}
因为从个位开始存,所以正好逆序
void read_i(int n,int a[]){//单精度-->高精度
while(n){//小框架
a[++a[0]]=n%10;//存储每一位
n/=10;
}
if(!a[0]) a[0]=1;//判断n=0吗,这样也是一位数
}
4.加法
就和平常差不了多少
先来伪代码
c[0]=a[0],b[0]最大值
枚举每一位
x=a[i]+b[i]+u;//u:是否进位
c[i]=个位;
u=进位(就是十位);
会不会多一位
正式代码就不加注释了
void plus(int a[],int b[],int c[]){
c[0]=max(a[0],b[0]);
bool u=0;
for(int i=1;i<=c[0];++i){
int t=a[i]+b[i]+u;
c[i]=t%10;
u=t/10;
}
if(u) c[++c[0]]=1;
}
5.减法
就和平常差不了多少
先来伪代码
c[0]=a[0],b[0]的最大值
for(int i=1~c[0])
int t=a[i]-b[i]-u;
有退位
u=1;
c[i]=t+10;
else
u=0;
c[i]=t;
把前导零去掉
代码
void minus(int a[],int b[],int c[]){
c[0]=max(a[0],b[0]);
bool u=0;
for(int i=1;i<=c[0];++o){
int t=a[i]-b[i]-u;
if(t<0){
u=1;
c[i]=t+10;
}else{
u=0;
c[i]=t;
}
}
while(c[c[0]]==0&c[0]>1/*记得不要忘了0鸭蛋*/) c[0]--;
}
6.比大小
返回值:a>b:-1 a=b 0 a<b:1
Problem:
如果两数是7 3返回-1
如果是 3 7
返回1
所以其实可以说返回 (a<b)*2-1
int compare(int a[],int b[]){
//a<b 1 a>b -1 a=b 0
if(a[0]!=b[0]) return (a[0]<b[0])*2-1;//先比位数
for(int i=a[0];i>=1;--i)//记得从高位
if(a[i]!=b[i]) return (a[i]<b[i])*2-1;//比一比
return 0;//那就一样
}