hdoj1047 Integer Inquiry(大整数的相加)

思路很简单,但感觉我做复杂了(┬_┬)

其实可以直接写一个两个大整数相加的函数,输入一个大整数就加一次。而我直接就输入所有数据,然后对全部数据一起处理,不仅耗费内存还耗费时间。

我的代码:

#include<stdio.h> 
#include<string>
using namespace std;
char a[105][105];
int b[200];
void change(char str[][105],int len,int k)//逆置字符串 
{
	int i,j;char c;
	i=0;j=len-1;
	while(j>i)
	{
		c=str[k][i];str[k][i]=str[k][j];str[k][j]=c;
		i++;j--;
	}
}
int main()
{
	int t,len,max,k;
	scanf("%d",&t);
	while(t--)
	{
	    max=-1;
		memset(a,'0',sizeof(a));memset(b,0,sizeof(b));
		int i=0;
		while(scanf("%s",a[i])&&a[i][0]!='0')
		{
			i++;
		}
		for(int j=0;j<i;j++)//逆置字符串,并记录最长的字符串长度 
		{
			len=strlen(a[j]);
			change(a,len,j);a[j][len]='0';
			if(max<len){max=len;k=j;}
		}
		for(int m=0;m<max;m++)
		for(int j=0;j<i;j++)//各位相加保存到对应数组b中 
		{
			b[m]+=a[j][m]-'0';
		}int r=0;int temp;
		for(int j=0;j<max;j++)//进位处理,使每个单元只保存一个个位数 
		{
			temp=r+b[j];
			b[j]=temp%10;
			r=temp/10;
		}
		while(r)//进位处理 
		{
			b[max++]=r%10;
			r=r/10;
		}
		for(int j=max-1;j>0;j--)
		printf("%d",b[j]);
		printf("%d\n",b[0]);
		if(t>0)printf("\n");//格式! 
	}
	return 0;
}

更简易的做法http://www.cnblogs.com/kuangbin/archive/2012/08/13/2635653.html

#include<stdio.h>
#include<string>
#include<iostream>
using namespace std;

//高精度加法
//只能是两个正数相加
string add(string str1,string str2)//高精度加法
{
    string str;

    int len1=str1.length();
    int len2=str2.length();
    //前面补0,弄成长度相同
    if(len1<len2)
    {
        for(int i=1;i<=len2-len1;i++)
           str1="0"+str1;
    }
    else
    {
        for(int i=1;i<=len1-len2;i++)
           str2="0"+str2;
    }
    len1=str1.length();
    int cf=0;
    int temp;
    for(int i=len1-1;i>=0;i--)
    {
        temp=str1[i]-'0'+str2[i]-'0'+cf;
        cf=temp/10;
        temp%=10;
        str=char(temp+'0')+str;
    }
    if(cf!=0)  str=char(cf+'0')+str;
    return str;
}


int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        string sum="0";
        string str1;
        while(cin>>str1)
        {
            if(str1=="0")break;
            sum=add(sum,str1);
        }
        cout<<sum<<endl;
        if(T>0)cout<<endl;
    }
    return 0;

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值