HDUOJ入坑的第一天--------1002题(计算A+B)

HDUOJ入坑的第一天--------1002题(计算A+B)

今天去HDUOJ逛了一下,尝试了一下以前竞赛的练习题,结果第一道题就被坑了,说出来你可能不信,A+B我居然不会。。。。。。看下题目吧:

在这里插入图片描述

题目意思大致说一下,就是求给定n组数对,求每对数的和,嗯,看起来简单吧,我也觉得,可是事实是这样的。。。。。。。。:

在这里插入图片描述
我当时很懵,我小学学的还是挺好的,怎么加法都不会了。。。。。。。
然后
又看了一遍题目,突然想到这里它说得的加法它的数字位数有猫腻,(去他的Integer,就知道误导学生入坑),10000位的整数。。。。。int小身子板它表示不出来,所以,机智的我改用了char类型数组,下面是我的代码,(已ac)


#include <stdio.h>
#include <string.h>

int main() {
	/*
	* n代表要计算几次
	* num1len 表示第一个数的长度位数, num2len 表示第二个数的长度位数, sumlen;
	*/
    int n, temp, num1len, num2len, sumlen;
    /*存放结果的*/
    int sum[10000];
	/*输入参数*/
    scanf("%d", &n);
   
    for (int i =1; i <= n; i++)
    {
    	
        char num1[10000], num2[10000], temp1[10000], temp2[10000];

        temp = 0;
        scanf("%s %s", temp1, temp2);
		 /*拷贝一份两个加数,用于后面的加法转换 */
		for (int l1 = 0; l1 <= strlen(temp1); l1++)
        {
            num1[l1] = temp1[l1];
        }

        for (int l2 = 0; l2 <= strlen(temp2); l2++)
        {
            num2[l2] = temp2[l2];
        }

        num1len = strlen(num1);
        num2len = strlen(num2);
        /*求出和的最小位数*/
        sumlen = (num1len > num2len ? num1len : num2len);
		/*将备份数组反过来,逐位对齐,
		*1234
		*123456
		*操作后
		*432100
		*654321
		*/
        if (num1len > num2len)
        {
            for (int r = sumlen - 1, s = num2len - 1; r >= 0; r--, s--)
            {
                if (r >= sumlen - num2len)
                {
                    num2[r] = num2[s];
                } else
                {
                    num2[r] = '0';
                }
            }
        } else
        {
            for (int r = sumlen - 1, s = num1len - 1; r >= 0; r--, s--)
            {
                if (r >= sumlen - num1len)
                {
                    num1[r] = num1[s];
                } else
                {
                    num1[r] = '0';
                }
            }
        }
		/*逐位相加,满十近一*/
        for (int z = sumlen - 1; z >= 0; z--)
        {
            sum[z] = (num1[z] + num2[z] + temp - 2 * '0') % 10;
            temp = (num1[z] + num2[z] - 2 * '0' + temp) / 10;
        }
		/*打印结果*/
        printf("Case %d:\n", i);
        printf("%s + %s = ", temp1, temp2);
        if (temp)
        {
            printf("%d", temp);
        }
        for (int w = 0; w < sumlen; w++)
        {
            printf("%d",sum[w]);
        }
        printf("\n");
        if (i != n)
        {
            printf("\n");
        }
    }
    
    return 0;
}

写的有点乱,但思路是这样,需要注意的是,这里不能用int
结果(ac了,开心,哈哈哈,我还不傻):
在这里插入图片描述

发布了25 篇原创文章 · 获赞 35 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/LioTomcat/article/details/104907641
今日推荐