HDU-OJ 1002 A+B II

题目
HDU-OJ 1002 A+B II_第1张图片
题目大意

  • 输入:第一行输入测试用例的个数,下面几行是对应的测试用例,包含A和B,首先明确题目是在整型范围内的,题目明确说明不一定可以使用32位整型来解决问题,后面又补充可以假设整型的长度在1000位以内,所以64位整型也不一定可以解决问题,超出了整型变量可以处理的范围,所以只能利用以字符串的形式来读取数据并思考长整型的加法运算规律来AC
    -输出:按题目要求输出,注意空格和空行,同时最后一行结果的输出有坑(祥见代码)
    AC代码
# include 
# include 
# define N 1002  //1000位整型+1000位整型最大是1001位整型,1002足够
int main()
{
    char aa[N],bb[N];
    int n,i,a[N],c[N],b[N],p,q,temp,j,k,Max,order=0;
    scanf("%d",&n);
    while(scanf("%s%s",&aa,&bb)!=EOF)  //读入所要计算的两个数据
    {
        order++; //控制题目中要求的#
        printf("Case %d:\n",order);
        printf("%s + %s = ",aa,bb);//按照要求的格式输出
        p=strlen(aa);
        for(i=0;i<p;i++)
        {
            a[i]=(int)(aa[i]-48);//字符转化成整型数据
        }
        q=strlen(bb);
        for(i=0;i<q;i++)
        {
            b[i]=(int)(bb[i]-48);
        }
        if(p>=q)//当数组a位数较多时
        {
            Max=p; //定义Max是为了最后控制c数组的输出格式
            for(i=0;i<=p;i++)
            {
                c[i]=0;//方便进位和控制c数组的输出,所以提前将c数组置0
            //为了防止在最高位上产生进位,所以c的空间要比位数最多的那个数还要多一个
            }
            k=p;//k是个位数对应的下标
            i=p-1;//i永远存放大位数长
            j=q-1;//j永远存放小位数长
            while(j>=0) //用小的那个数来控制加减
            {
                c[k]=c[k]+a[i]+b[j];//可能会有进位,所以等式右边有c[k]
                if(c[k]>=10)
                {
                    c[k]=c[k]-10;
                    c[k-1]++;//有进位时,前一位要加1(要注意高位的下标是小的)
                }
                k--;
                j--;
                i--;
            }
            while(i>=0)//位数多的加完之后照挪
            {
                c[k]=c[k]+a[i];
                k--;
                i--;
            }
        }
        else//数组b位数>=数组a位数时(相当于上面变量的一个逆变换)
        {
            Max=q;
            for(i=0;i<=q;i++)
            {
                c[i]=0;
            }
            k=q;
            i=q-1;
            j=p-1;
            while(j>=0)
            {
                c[k]=c[k]+b[i]+a[j];
                if(c[k]>=10)
                {
                    c[k]=c[k]-10;
                    c[k-1]++;
                }
                k--;
                j--;
                i--;
            }
            while(i>=0)
            {
                c[k]=c[k]+b[i];
                k--;
                i--;
            }
        }
        if(c[0]==0)   //两数相加没有产生进位,第一个0是不可以输出的
        {
            for(i=1;i<=Max;i++)
            {
                printf("%d",c[i]);
            }
        }
        else    //两数相加产生了进位,直接将C数组输出
        {
            for(i=0;i<=Max;i++)
            {
                printf("%d",c[i]);
            }
        }
        printf("\n");
        if(order==n) //提前输入了case个数,在达到时最好要退出(虽然系统对此要求不严)
            break;
        printf("\n");//题目疏漏:最后一个case是不需要在多换一行的
    return 0;
}

评价
一定要看清题目要求,选用正确的数据类型,不然这个题很难做出来,难点在于数据类型的选用上面,输出形式上要求比较严格,同时两个数相加要考虑进位。

你可能感兴趣的:(算法)