smartZhou


私信TA

用户名:smartZhou

访问量:1202

签 名:

刚注册不到一个月,多多关照!

排  名 77
经  验 3781
参赛次数 1
文章发表 87
年  龄 0
在职情况
学  校 T S university
专  业 计算机科学与技术

  自我简介:

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

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作为 相加的结果
}


  评论区

加优
2019-01-07 15:17:51 | |
  • «
  • 1
  • »