您的位置:首页 > 其它

hdu 1002 A + B Problem II(大数模拟加法)

2015-05-23 12:45 525 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1002

题目要求:输入t 为测试组数,然后输入两个正数 a,b求和;

【思路】

首先,用字符串读入a,b,再将a,b 逆序存到数组中,然后对应位相加就行了,长度小的数要注意补零

倒过来做可以让进位变得方便 ,如果对应位的和大于等于10,就把余数储存在当前位置,后一位加1;



【代码】

#include <iostream>
#include <string>
#include <cstring>
#include <cstdio>
using namespace std;
int main()
{
	int n,cas=1;
	cin>>n;
	int s1[1111];int s2[1111];
        char a[1111];char b[1111];
	while(n--)
	{
		memset(s1,0,sizeof(s1));
		memset(s2,0,sizeof(s2));
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));
		cin>>a>>b;
		if(cas!=1)
			cout<<"\n";
		cout<<"Case "<<cas<<":"<<endl;
		cout<<a<<" "<<"+"<<" "<<b<<" "<<"="<<" ";
		int lena=strlen(a);
		int lenb=strlen(b);
		char *max=0;  //放到一块定义 char *max,*min  //复习一下指针
		char *min=0;
		int maxl,maxs;
		if(lena>=lenb)
			{ max=a; min=b; maxl=lena; maxs=lenb;}  //用max指针指向长度较大的数 min指向长度较小的数;
		else
			{ max=b; min=a; maxl=lenb; maxs=lena;}
	
			for(int i=0;i<maxl;i++)
			{
				s1[i]= max[maxl-i-1]-48;//逆序存到数组
			}
			int k=0;
			for(int i=0;i<maxl;i++)
			{
				if(i<maxs)
					s2[i]=(min[maxs-i-1]-48);
				else
					s2[i]=0;//后面补零
			}
		int tt;
		for( tt=0;tt<maxl;tt++)
		{
			int ans=s1[tt]+s2[tt];
			if(ans>=10)
			{
				s1[tt]=ans%10;
				s1[tt+1]+=1;
			}
			else
				s1[tt]=ans;
		}
		if(s1[maxl]!=0)//如果和超过maxl,maxl+1;
			maxl+=1;
		for(int i=maxl-1;i>=0;i--)
			cout<<s1[i];
		cout<<endl;
	
		cas++;
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: