Life of xhu

About

回学校了: & HOJ_1401

Feb 17, 2014

  |   #日常   |   #HOJ

今天只做了一道水题,话说回来,在学校里做题真是没有感觉啊,周围的人都太闹了,还是在家里刷题舒服。

上午给导师打电话,导师让我明天早上去他办公室,下午又看了一会儿PIC6622的资料,应该马上就要正式开工了。

加油!!

~~~~~~~~~~~~我是萌萌的昏割线~~~~~~~~~~~~~

1401: 这道题的要求就是给一个超长整数求和,一开始输入的数字N是两个整数的位数,然后输入N对数字,分别是两个整数从高到低的每一位上的数字,然后求和。

一开始我是想简单的用数组存,但是我发现,如果在程序中声明了三个长度为1000000的数组,编译得到的文件是无法正常运行的,然后我改了改程序,把数组减少到了一个,但是还是不行,虽然这样编译得到的程序可以运行,但是放到HOJ上会出现超出内存错误,所以,数组是必须要放弃的。

然后就简单了,老老实实一个一个算然后输入吧,从大往小求和,关键就是进位的问题,即在输出高位和时,要注意低位有没有进位。而低位之和如果大于9就绝对有进位,小于9就绝对没进位,如果低位之和等于9,则要继续往低位算,并设置一个计数器,低位之和仍为9时,计数器累加一次,直到遇到相加不为9的情况出现。

在遇到相加不为9的情况下,如果大于9,即产生了进位,即输出计数器的值对应个数的0,否则,输出其值对应个数的9

当然,如果在输入和为9的循环中没有遇到和不为9的结束信号,同时输入位数已经达到,也应该跳出循环,并输出计数器个数的9

然后就是一些细节问题,比如这道题一定要用stdio.h来输入输出,用iostream会报错。

printf输出单个数字时,最好不要使用printf(0)这样的形式,宁愿使用printf("0"),前者可能出现不可预知的错误。

话不多说,代码如下:

#include <stdio.h>

int main(){
    int d1, d2, N, num_of_9, sum1, sum2;
    bool at_start;
    while(scanf("%d", &N)==1){
        sum1 = 0;
        for(int i = 0; i < N; i++){
            scanf("%d %d", &d1, &d2);
            sum2 = d1 + d2;
            if(sum2 > 9){
                printf("%d", sum1 + 1);
                sum1 = sum2 % 10;
            }else if(sum2 < 9){
                if(i != 0)
                    printf("%d", sum1);
                sum1 = sum2;
            }else{
                at_start = i == 0 ? true : false;
                if(i == N - 1){
                    if(!at_start) printf("%d", sum1);
                        sum1 = 9;
                }else{
                    num_of_9 = 1;
                    while(scanf("%d %d", &d1, &d2) && d1 + d2 == 9){
                        i++;
                        num_of_9++;
                        if(i == N - 1)
                            break;
                    }
                    sum2 = d1 + d2;
                    i++;
                    if(sum2 > 9){
                        printf("%d", sum1 + 1);
                        for(int j = 0; j < num_of_9; j++)
                            printf("0");
                        sum1 = sum2 % 10;
                    }
                    else if(sum2 < 9){
                        if(!at_start) printf("%d", sum1);
                        for(int j = 0; j < num_of_9; j++)
                            printf("9");
                        sum1 = sum2;
                    }else{
                        if(!at_start) printf("%d", sum1);
                        for(int i = 0; i < num_of_9 - 1; i++)
                            printf("9");
                        sum1 = 9;
                    }
                }
            }
        }
        printf("%d\n", sum1);
    }
}