Peter算法小课堂—高精度加法

指针与数组

看看以下代码,请预测答案

#include <bits/stdc++.h>
using namespace std;
int x[10]={0,1,2,3,4,5,6,7,8,9};
int main(){
	cout<<x<<endl;
	cout<<x+3<<endl;
	cout<<*x<<endl;
	cout<<*(x+7)<<endl;
	cout<<(x+4)[1]<<endl;
	return 0;
}

解答:

1.x为x[]数组第一个元素的地址

2.x+3为x[]数组第四个元素的地址

3.*x为数组第一个元素

4.*(x+7)为数组第8个元素

5.(x+4)[1]为第5个元素后面一个元素 

x+y问题

函数总览:

1.converts() 字符串转为高精度大数

2.add() 将两个高精度大数相加(类似竖式)

3.print() 输出一个高精度大数(删除前导0)

4.main()主函数 调用函数

main()

输入两个字符串,用converts转化为x[]与y[],再用add模拟竖式将两数相加,print输出

代码:

string s1,s2;
cin>>s1>>s2;
converts(x,s1);
converts(y,s2);
add(x,y);
print(x);

相信大家应该看得懂吧

converts()

先给代码

void converts(int *a,string s){
	int i,len=s.size();
	for(i=0;i<len;i++) a[i]=s[len-i-1]-'0';
	for(;i<SIZE;i++) a[i]=0;
}

注意事项:

1.i定义在循环外,不能for(int i=0;i<len;i++)

2.len-i-1不能忘记减1

3.字符转整数要-'0'

*第四行代码有的童鞋看不懂,我解释下哈,这里因为i定义过了,省略int i=这一部分

add()

发现别的大佬都写了好长一段代码,我只需要7行代码解决add()

上代码,

void add(int *a,int *b,int len=SIZE){
	for(int i=0;i<len;i++)
		if((a[i]+=b[i])>=10){
			a[i+1]++;
			a[i]-=10;
		}
}

思路:遍历每一位,将两个数相加,若大于10,则进位

*搅得有的小彭友看不懂第3行,我来解释下,这里是先a[i]+=b[i],再把结果与10比较

print()

易错点就删除前导0吧,其他没什么了……

void print(int *a){
	int i;
	for(i=SIZE-1;i>0;i--) if(a[i]>0) break;
	for(;i>=0;i--) cout<<a[i];
	cout<<endl;
}

大家想看一个小视频吗,👇

[C++] 高精加法😎🕵️‍♂️算法详解❗_哔哩哔哩_bilibili

x+y+z问题

#include <bits/stdc++.h>
using namespace std;
#define SIZE 550
int x[SIZE],y[SIZE],z[SIZE];
void converts(int *a,string s){
	int i,len=s.size();
	for(i=0;i<len;i++) a[i]=s[len-i-1]-'0';
	for(;i<SIZE;i++) a[i]=0;
}
void add(int *a,int *b,int len=SIZE){
	for(int i=0;i<len;i++)
		if((a[i]+=b[i])>=10){
			a[i+1]++;
			a[i]-=10;
		}
}
void print(int *a){
	int i;
	for(i=SIZE-1;i>0;i--) if(a[i]>0) break;
	for(;i>=0;i--) cout<<a[i];
	cout<<endl;
}
int main(){
    freopen("plus.in","r",stdin);
    freopen("plus.out","w",stdout);
	string s1,s2,s3;
	cin>>s1>>s2>>s3;
	converts(x,s1);
	converts(y,s2);
	converts(z,s3);
	add(x,y);
	add(x,z);
	print(x);
	return 0;
}

希望这些对大家有用,三连必回

https://blog.csdn.net/qq_51184727/article/details/129971145 ←看得见吗

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值