每次都死在邊界問題啊……
0 * 0 = 0
/* ACM 10106 Product */
/* mythnc
* 2011/11/13 13:12:16
* run time: 0.008
*/
#include <stdio.h>
#include <string.h>
#define MAXCHAR 251
#define MAXD 500
void init(int *);
void reverse(char *);
void mul(char *, char *, int *);
int ctoi(char);
void print(int *);
int main(void)
{
char x[MAXCHAR], y[MAXCHAR];
int product[MAXD];
while (scanf("%s\n%s", x, y) == 2) {
init(product);
reverse(x);
reverse(y);
mul(x, y, product);
print(product);
}
return 0;
}
/* init: initialize product */
void init(int *p)
{
memset(p, 0, MAXD * sizeof(int));
}
/* reverse: reverse char arrry s */
void reverse(char *s)
{
int i, j;
char tmp;
for (i = 0, j = strlen(s) - 1; i < j; i++, j--) {
tmp = s[i];
s[i] = s[j];
s[j] = tmp;
}
}
/* mul: do x * y save result in p */
void mul(char *x, char *y, int *p)
{
int i, j, lenx, leny;
lenx = strlen(x);
leny = strlen(y);
for (i = 0; i < lenx; i++)
for (j = 0; j < leny; j++)
p[i + j] += ctoi(x[i]) * ctoi(y[j]);
/* carry */
for (i = 0; i < lenx + leny - 1; i++)
if (p[i] > 9) {
p[i + 1] += p[i] / 10;
p[i] %= 10;
}
}
/* ctoi: return char to int */
int ctoi(char c)
{
return c - '0';
}
/* print: print p from high to low */
void print(int *p)
{
int i;
for (i = MAXD - 1; p[i] == 0 && i > 0; i--)
;
for (i; i > -1; i--)
printf("%d", p[i]);
putchar('\n');
}
沒有留言:
張貼留言