HDU--1002

点击打开原题

大数的加法

自己重新定义了一下加法,有点复杂

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    int T, i, j, ia, ib,is;
    char ch;
    vector<char> *cSum;
    vector<int> *iA, *iB;
    cin >> T;
    iA = new vector<int>[T];
    iB = new vector<int>[T];
    cSum = new vector<char>[T];

    ch = getchar();
    for (i = 0; i < T; i++)
    {
        while ((ch=getchar())!=' ')
        {
            ia = ch - '0';
            iA[i].push_back(ia);
        }
        while ((ch = getchar()) !='\n')
        {
            ib = ch - '0';
            iB[i].push_back(ib);
        }
    }
    int h;
    for (i = 0; i < T; i++)
    {
        int carry = 0;//进位
        if (iA[i].size() >= iB[i].size())
        {
            for (j = iA[i].size(), h = iB[i].size(); h > 0; j--, h--)
            {
                is = iA[i][j - 1] + iB[i][h - 1] + carry;
                if (is > 9)
                {
                    carry = 1;
                    is -= 10;
                    ch = is + '0';
                    cSum[i].push_back(ch);
                    if (j == 1)
                        cSum[i].push_back('1');        
                }
                else
                {
                    carry = 0;
                    ch = is + '0';
                    cSum[i].push_back(ch);
                }
            }
            for (j = iA[i].size() - iB[i].size() - 1; j >= 0; j--)
            {
                is = iA[i][j] +carry;
                if (is > 9)
                {
                    carry = 1;
                    if (j != 0)
                        is -= 10;
                }
                else
                {
                    carry = 0;
                }
                ch = is + '0';
                cSum[i].push_back(ch);
            }
        }
        else
        {
            for (j = iB[i].size(), h = iA[i].size(); h > 0; j--, h--)
            {
                is = iB[i][j - 1] + iA[i][h - 1] + carry;
                if (is > 9)
                {
                    carry = 1;
                    is -= 10;
                    ch = is + '0';
                    cSum[i].push_back(ch);
                    if (j == 1)
                        cSum[i].push_back('1');

                }
                else
                {
                    carry = 0;
                    ch = is + '0';
                    cSum[i].push_back(ch);
                }
            }
            for (j = iB[i].size() - iA[i].size() - 1; j >= 0; j--)
            {
                is = iB[i][j] + carry;
                if (is > 9)
                {
                    carry = 1;
                    if (j != 0)
                        is -= 10;
                }
                else
                {
                    carry = 0;
                }
                ch = is + '0';
                cSum[i].push_back(ch);
            }
        }
    }
    for (i = 0; i < T; i++)
    {
        if (i != 0) cout << endl;
        cout << "Case " << i+1 << ":\n";
        for (j =0; j < iA[i].size(); j++)
        {
            cout << iA[i][j];
        }
        cout << " + ";
        for (j = 0; j < iB[i].size(); j++)
        {
            cout << iB[i][j];
        }
        cout << " = ";
        for (j = cSum[i].size() - 1; j >= 0; j--)
        {
            cout << cSum[i][j];
        }
        cout << endl;
    }
    return 0;
}
看看别人写的,真简洁

#include <stdafx.h>
#include<stdio.h>
#include<string.h>
void bigSum_1(void);
int main()
{
	bigSum_1();
}
void bigSum_1(void)
{
	char a[1000],b[1000],c[1001];
	int i,j=1,p=0,n,n1,n2;//i是c的下标,j是case j,p是进位的标记,n是行数,n1n2是要加的数的最后一位的下标
	scanf("%d",&n);
    while(n)//n是行数,后面使用n--来重复输入
	{
		scanf("%s %s",a,b);
		printf("Case %d:\n",j);
		printf("%s + %s = ",a,b);
		n1=strlen(a)-1;//strlen是真正存入的最后一位的数的下标,如输入12345那么strlen为5其下标是4
		n2=strlen(b)-1;
		for(i=0;n1>=0||n2>=0;i++,n1--,n2--)//i负责表示z的下标
		{
			if(n1>=0&&n2>=0){c[i]=a[n1]+b[n2]-'0'+p;}//当两者位数相同时
			if(n1>=0&&n2<0){c[i]=a[n1]+p;}//位数不同
			if(n1<0&&n2>=0){c[i]=b[n2]+p;}
			p=0;
			if(c[i]>'9'){c[i]=c[i]-10;p=1;}//进位
		}
		if(p==1){printf("%d",p);}//如果要进位,先输出1
		while(i--)
		{printf("%c",c[i]);}//倒序输出c即正着的和
		j++;
		if(n!=1){printf("\n\n");}//最后一个下面不要空行
		else {printf("\n");}
		n--;
	}
}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值