/* * Long Multiplication Solution */ #include #include #define MAXDIGS 10 int n1[MAXDIGS], n2[MAXDIGS]; /* the numbers to be multiplied */ int n1sig; /* # of significant digits in n1 */ int nsteps; /* # of significant digits in n2 */ int partial[MAXDIGS+1]; /* an intermediate term */ int result[MAXDIGS*2]; /* the final result */ /* Determine the number of significant digits in p */ int numsig(int *p, int width) { while (!*p++) { width--; if (width == 0) return 1; } return width; } /* Obtain an input integer, returning 0 on failure, 1 on success */ int getnum(int *p) { char num[MAXDIGS+1], ntemp[MAXDIGS+1]; int i, c, n=0; while ((c = getchar()) == ' ' || c == '\t') ; if (c == '\n') return 0; while (isdigit(c)) { num[n++] = c; c = getchar(); } ungetc(c,stdin); num[n] = '\0'; for(i=0;i0;i--) { temp = n2[pos-1] * n1[i-1] + carry; partial[i] = temp % 10; carry = temp / 10; } partial[0] = carry; } void add(int pos) { int i, j, temp, carry=0; for (i=MAXDIGS;i>=0;i--) { temp = partial[i] + result[i+pos-1] + carry; result[i+pos-1] = temp % 10; carry = temp / 10; } result[i+pos-1] += carry; } main() { int i; while (getinput()) { display(MAXDIGS+1,n1,MAXDIGS); display(MAXDIGS+1,n2,MAXDIGS); i = (n1sig > nsteps) ? n1sig : nsteps; hdisplay(2*MAXDIGS+1-i,i); for(i=0;iMAXDIGS-nsteps;i--) { multiply(i); display(i,partial,MAXDIGS+1); add(i); } if (nsteps > 1) { i = numsig(result,2*MAXDIGS); hdisplay(2*MAXDIGS+1-i,i); display(1,result,MAXDIGS*2); } putchar('\n'); } }