HDU--1002

来源:互联网 发布:美工详情页一般多少钱 编辑:程序博客网 时间:2024/06/05 04:27

点击打开原题

大数的加法

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

#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其下标是4n2=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);}//如果要进位,先输出1while(i--){printf("%c",c[i]);}//倒序输出c即正着的和j++;if(n!=1){printf("\n\n");}//最后一个下面不要空行else {printf("\n");}n--;}}



1 0
原创粉丝点击