码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-05-23 14:19:49      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:大数   acm   

题目链接: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;
}


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

标签:大数   acm   

原文地址:http://blog.csdn.net/chaiwenjun000/article/details/45933659

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!