#include #include #include typedef struct _num { int len; char c[1020]; } num; void add(num *res, num *n1, num *n2) { int len = n1->len; int i, x, carry; if (n2->len > len) len = n2->len; len++; res->len = len; carry = 0; for (i=0; ilen) x += n1->c[n1->len-i-1] - '0'; if (ilen) x += n2->c[n2->len-i-1] - '0'; if (x>=10) { carry = 1; x-=10; } else carry = 0; res->c[len-i-1] = x + '0'; } res->c[0] = carry + '0'; } void multsingle(num *res, num *n1, int n2) { int len = n1->len; int i, x, carry; len+=2; res->len = len; carry = 0; for (i=0; ilen; i++) { x = carry; x += (n1->c[n1->len-i-1] - '0') * n2; carry = x/10; res->c[len-i-1] = x%10 + '0'; } res->c[1] = carry%10 + '0'; res->c[0] = carry/10 + '0'; } void sub(num *res, num *n1, num *n2) { int len = n1->len; int i, x, carry; if (n2->len > len) len = n2->len; res->len = len; carry = 0; for (i=0; ic[n1->len-i-1] - '0'; if (ilen) x -= n2->c[n2->len-i-1] - '0'; x -= carry; if (x<0) { carry = 1; x+=10; } else carry = 0; res->c[len-i-1] = x + '0'; } } void readnum(num *n, char *buf) { int i=0; while (buf[i] >= '0' && buf[i] <= '9') { n->c[i] = buf[i]; i++; } n->len = i; } void removezeroes(num *n) { int i=0; while (i < n->len-1 && n->c[i] == '0') i++; n->len -= i; memmove(n->c, n->c+i, n->len*sizeof(char)); } void printnum(num *n, int len) { char buf[1024]; memcpy(buf, n->c, n->len*sizeof(char)); buf[n->len] = '\0'; printf("%*s", len, buf); } int printaddsub(num *n1, num *n2, int len3, char op) { int len = n1->len; char buf[1024]; if (n2->len+1 > len) len = n2->len+1; if (len3 > len) len = len3; memcpy(buf, n1->c, n1->len*sizeof(char)); buf[n1->len] = '\0'; printf("%*s\n", len, buf); buf[0] = op; memcpy(buf+1, n2->c, n2->len*sizeof(char)); buf[n2->len+1] = '\0'; printf("%*s\n", len, buf); return len; } void addzeroes(num *n1, int len) { int m = len - n1->len; int i; if (m<=0) return; memmove(n1->c+m, n1->c, n1->len*sizeof(char)); for (i=0; ic[i] = '0'; n1->len += m; } void copynum(num *n1, num *n2) { n1->len = n2->len; memcpy(n1->c, n2->c, n2->len*sizeof(char)); } void copynumremove(num *n1, num *n2) { if (n2->c[0] != '0') copynum(n1, n2); else { n1->len = n2->len-1; memcpy(n1->c, n2->c+1, (n2->len-1)*sizeof(char)); } } void trailingzeroes(num *n1, int n) { int i; if (!n) return; for (i=0; ic[n1->len + i] = '0'; n1->len += n; } int fullmult(num *n1, num *n2, int len, int *len1, int pass) { int glen = n1->len + n2->len + 1; int n; int lastlen; char buf[1024]; num n3, n4, nres; nres.len = 1; nres.c[0] = '0'; if (pass) { if (n2->len + 1 > len) len = n2->len + 1; } if (pass) { int i, len2; memcpy(buf, n1->c, n1->len*sizeof(char)); buf[n1->len] = '\0'; printf("%*s\n", len, buf); buf[0] = '*'; memcpy(buf+1, n2->c, n2->len*sizeof(char)); buf[n2->len+1] = '\0'; printf("%*s\n", len, buf); len2 = n2->len+1; if (*len1 > len2) len2 = *len1; for (i=0; ilen; n++) { multsingle(&n3, n1, n2->c[n2->len-n-1] - '0'); if (!pass && n==0) { removezeroes(&n3); *len1 = n3.len; } if (pass) { removezeroes(&n3); memcpy(buf, n3.c, n3.len*sizeof(char)); buf[n3.len] = '\0'; printf("%*s\n", len-n, buf); if (len-n > n3.len) lastlen = 1; else lastlen = 0; } addzeroes(&n3, glen-n); trailingzeroes(&n3, n); copynumremove(&n4, &nres); add(&nres, &n3, &n4); } removezeroes(&nres); if (pass && n2->len > 1) { int i; if (nres.len == len) lastlen=0; for (i=0; i<(len-lastlen); i++) buf[i] = '-'; buf[i] = '\0'; printf("%*s\n", len, buf); printnum(&nres, len); printf("\n"); } glen = nres.len; if (n1->len > glen) glen = n1->len; if (n2->len+1 > glen) glen = n2->len+1; return glen; } int main() { long N, n; char buf[1024]; num n1, n2, n3; char op; int len, len2, len1; int i; fgets(buf, 1024, stdin); N = strtol(buf, NULL, 10); for (n=0; n len2) len2 = n3.len; for (i=0; i len2) len2 = n3.len; for (i=0; i