XDOJ1229 - A Game

Description

仔细看下面的图。然后给你两个数,你的任务是输出第三个数。

 

 

 

Input
第一行一个整数T(1<=T<=30),表示数据的组数;
每组数据两个整数 A,B (1<=B<=A<=10^100);
Output
输出一个整数。
Sample Input
3
99 72
45 27
39 18
Sample Output
27
18
21

解题思路:

开始以为只是大整数的减法,后来总是WA,上网一查才明白,原来是每个数年各个位相加的和。下面是写的大整数的减法,留个纪念吧

#include<iostream>
#include<string>
#include<iomanip>
using namespace std;

const int D = 17;
const long long maxN = 1000000000000000000;
long long  numA[D];
long long  numB[D];
void zeroArr(long long a[])
{
    for(int i=0;i<D;++i)
        a[i] = 0;
}
int strToArr(string str,long long a[])
{
    int len = str.length();
    long long factor =1;
    int k = 0;
    a[k] = 0;
    for(int i=len-1;i>=0;--i)
    {
        if(factor==maxN)
        {
            ++k;
            factor = 1;
        }
        int t = str[i]-'0';
        a[k] += t*factor;
        factor *= 10;

    }
    return k+1;
}
void ArrMinus(long long a[],int lena,long long b[],int lenb)
{
    for(int i=lena-1;i>=0;--i)
    {
        if(b[i]<=a[i])
            a[i] = a[i]-b[i];
        else
        {
            int j = i+1;
            while(a[j]==0)
                ++j;
            --a[j];
            --j;
            while(j>i)
            {
                a[j] += maxN-1;
                --j;
            }
            a[i] += maxN;
            a[i] = a[i]-b[i];
        }
    }
}
void print(long long a[],int len)
{
    int i = len-1;
    while(a[i]==0&&i>=0) --i;
    if(i==-1)
        cout<<0<<endl;
    else
    {
        cout<<a[i];
        --i;
        for(;i>=0;--i)
            cout<<setw(D+1)<<setfill('0')<<a[i];
        cout<<endl;
    }

}
int main()
{
    int caseN;
    cin>>caseN;
    for(int m=0;m<caseN;++m)
    {
        string Astr,Bstr;
        cin>>Astr>>Bstr;
        zeroArr(numA);
        zeroArr(numB);
        int len1 = strToArr(Astr,numA);
        int len2 = strToArr(Bstr,numB);
        ArrMinus(numA,len1,numB,len2);
        print(numA,len1);
    }
    return 0;
}

正确程序:

#include<iostream>
#include<string>
#include<iomanip>
using namespace std;

int main()
{
    int caseN;
    cin>>caseN;
    for(int m=0;m<caseN;++m)
    {
        string strA,strB;
        cin>>strA>>strB;
        int sum;
        sum = 0;
        for(int i=0;i<strA.length();++i)
            sum += strA[i]-'0';
        for(int i=0;i<strB.length();++i)
            sum += strB[i]-'0';
        cout<<sum<<endl;
    }
    return 0;
}


你可能感兴趣的:(XDOJ1229 - A Game)