——解决大数和问题

引言

总所周知 c++中整型的最大数位为一般就是long long int 类型(10^18)

可当题目要求数位过高时,我们应该如何操作呢?

大数相加的思路:

大致是运用string类,模拟算术运算,可以用栈来做颠倒数位的工作
下面上例题:

小明在做小红给他出的算术题加法题,但是小红为了治一治小明懒惰的毛病,给他出的数都很大,这下小明郁闷了,想请你帮忙。

输入 输入的第一行是一个正整数N,表示一共有N组测试数据。 每组数据由1~100行正整数组成,每行正整数的长度不大于100位。
当输入0时,表示此组数据输入完毕。 输出 对于每组输入数据,输出所有数字的总和。每两组输出数据之间有一个空行。

样例输入

2
123456789012345678901234567890
123456789012345678901234567890
123456789012345678901234567890
0
12
34
0

样例输出

370370367037037036703703703670

46

上代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string>
#include<stack>
using namespace std;
	stack<char>st;
	string bigsum(string a,string b)//大数相加函数 
	{	string ans="";
			if(a=="0")
			return b;
		int la=a.length() -1;
		int lb=b.length()-1;//由于at的查询自0起 
		int c=0;
		while(la>=0&&lb>=0)//由于0的ASCII码是48;
		{	c+=a.at(la)-'0'+b.at(lb)-'0';//减去0即转为int的aslii码
			st.push((char)(c%10+'0'));//加上0即转为char类型
			c/=10;
			la--;
			lb--;                                           
		}
		while(la>=0)
		{
			c+=a.at(la)-'0';
			st.push((char)(c%10+'0'));
			c/=10;
			la--; 
		}
		while(lb>=0)
		{
			c+=a.at(lb)-'0';
			st.push((char)(c%10+'0'));
			c/=10;
			lb--; 
		}
		while(c!=0)
		{
			st.push((char)(c%10+'0'));
			c/=10;
		}
		while(!st.empty())
			{
				ans+=st.top();
				st.pop() ;
				 
			}
			return ans;
	} 
	int main()
	{
		int t;
		string n;
		cin>>t;
		while(t--)
		{	string s="0";
			while(cin>>n)
			{
			if(n=="0")
			{
				if(s!="0")
				cout<<s<<endl;
				break;
			 } 
			s=bigsum(s,n);
			 
		}
			if(t>0)
			{
				printf("\n");
		}
		
		}
		return 0;
	 } 

其中易错点就是int类型与char类型在转换过程中加减0的处理;

写了一个更简化的版本

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
string x,y;
int a[10000],b[10000],c[10000],la,lb,lc;
int main()
{
	cin>>x>>y;
	la=x.length() ;
	lb=y.length() ;
	for(int i=0;i<la;i++)
	a[la-i]=x[i]-'0';
	for(int i=0;i<lb;i++)
	b[lb-i]=y[i]-'0';
	lc=max(la,lb);
	for(int i=1;i<=lc;i++)
		{c[i]+=a[i]+b[i];
		c[i+1]=c[i]/10;
		 c[i]%=10;}
		 if(c[lc+1]>0)	lc++;
		 for(int i=lc;i>0;i--)
		 	cout<<c[i];
		 return 0;
		 
		 
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ctgu20-acm-律

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值