“烦人的”高精度

定义:存储不能用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;//那就一样
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值