声明:本文引自一篇优质题解:

ACM基本输入输出之大数加法

编译环境:

Windows China HuaWei source Insight 4.0

Linux Debain Ubuntu/Kali g++

程序测试:

微信图片_20190106205036.png

解题思路:

基本思路为使用一个数组将所需要求得大数字存起来,然后进行倒序相加,发现超过十之后取模进位,再倒序输出去多余的0即可。

按从低位到高位的顺序两个数字的每一位对应相加,并加上低一位的进位(如果有进位的话),如果某一位对应的数字加起来大于10,就对10取模得到当前位上的数字,再向高位进1,然后再考虑更高一位数字的相加,依次类推,如果位数较长的那个数字的最高位还有进位,别忘记了位数还要增加1。

推导图:

微信图片_20190106205431.png

注意事项:

    利用string可以更方便把数据传递给主函数,主函数只需要进行调用,而使用char[]虽说不是不能传递,但是相比string而言传递更加麻烦,麻烦则不方便主函数进行调用,可以见的,string在输出的时候直接cout即可,而char[]还要配合循环使用。

参考代码:

#include <iostream>
#include <string>
using namespace std;
string BigNumAdd(string,int,string ,int);  //函数声明
int main() 
{
	string a,b;       //用字符串来保存数据  C语言的朋友可以用char *
	cin>>a>>b;            
	if(a.size()<b.size()) //作用:把长串放在a中  短串放在b中  最终结果是存在a中
	{
		string temp=a;
		a=b;
		b=temp;
	}
	cout<<BigNumAdd(a,a.size(),b,b.size())<<endl;  //函数调用 
	return 0;
} 
string BigNumAdd(string a,int lena,string b,int lenb)
{
	int aa,bb,sum,flag=0;       //flag进位标志,默认为0
	while(lena>0)              
	{
		aa=a[lena-1]-'0';   //将a字符串的最后一个字符变成数字
		if(lenb>0)
			bb=b[lenb-1]-'0';  //将b字符串的最后一个字符变成数字
		else 
			bb=0;
		sum=aa+bb+flag;     //sum用来保存a和b最后一个数字相加并加上进位
		if(sum>=10)         //相加大于10 当然要进位
		{
			a[lena-1]='0'+sum%10; 
			flag=1;     //进位标志设为1 
		}
		else 
		{
			a[lena-1]='0'+sum;
			flag=0;
		}
		lena--;
		lenb--;
	}
	if(flag==1)   //如果最高位的前面还有进位
		a="1"+a;  //则字符串追加  把1追加到a字符串的前面
	return a;         //返回a作为 相加的结果
}


点赞(7)
 

0.0分

9 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 2 条评论

cpython3 6年前 回复TA
@验题君 你才是这个系统的背后大神啊!
验题君 6年前 回复TA
加优