今天只做了一道水题,话说回来,在学校里做题真是没有感觉啊,周围的人都太闹了,还是在家里刷题舒服。
上午给导师打电话,导师让我明天早上去他办公室,下午又看了一会儿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);
}
}