先扣掉尾端的0,之後就能直接做加法。
做完加法之後,最前端的0也不要輸出即可。
練習寫虛擬碼看看……
eat token1 token2
cutouttrailingzero(token1)
cutouttrailingzero(token2)
sum = sumbig(token1 token2)
cutoutleadingzero(sum)
print(sum)
/* ACM 713 Adding Reversed Numbers
* mythnc
* 2011/12/02 12:34:53
* run time: 0.008
*/
#include <stdio.h>
#include <string.h>
#define MAXD 201
void ignorezero(char *, int);
int bigsum(char (*)[], int *);
void print(int *, int);
int main(void)
{
char v[2][MAXD];
int sum[MAXD];
int i, digit;
scanf("%*d");
while (scanf("%s %s", v[0], v[1]) == 2) {
for (i = 0; i < 2; i++)
ignorezero(v[i], strlen(v[i]) - 1);
memset(sum, 0, sizeof(sum));
digit = bigsum(v, sum);
print(sum, digit);
}
return 0;
}
/* ignorezero: cutting of trailing zero */
void ignorezero(char *s, int i)
{
while (s[i] == '0')
i--;
s[i + 1] = '\0';
}
/* bigsum: do v[0] + v[1] = sum,
* return sum's digit */
int bigsum(char (*v)[MAXD], int *sum)
{
int i, j;
for (i = 0; i < strlen(v[0]) && i < strlen(v[1]); i++)
sum[i] += v[0][i] - '0' + v[1][i] - '0';
for (; i < strlen(v[0]); i++)
sum[i] += v[0][i] - '0';
for (; i < strlen(v[1]); i++)
sum[i] += v[1][i] - '0';
/* carry */
for (j = 0; j < i; j++)
if (sum[j] > 9) {
sum[j + 1] += sum[j] / 10;
sum[j] %= 10;
}
if (sum[j] != 0)
return j + 1;
return j;
}
/* print: print out result */
void print(int *sum, int n)
{
int i;
/* do not print out leading zeros */
for (i = 0; sum[i] == 0; i++)
;
for (; i < n; i++)
printf("%d", sum[i]);
putchar('\n');
}
沒有留言:
張貼留言