2012-12-24 17:11:44Morris

[UVA] 11403 - Binary Multiplication

Problem: I

Binary Multiplication

           

 

All of us know simple multiplication rule.  Can we make a program to multiply two binary numbers? Well we can try.

 

 

Input specification:

Each case will define two binary strings (x & y). You can assume that length of each string will not exceed 30. The program will terminate with a 0 0.

 

Out put specification:

            Out put must be formatted like the following examples. You have to show the step by step procedure for the multiplication. Each result will be separated by an empty line.

 

Sample Input:

Output for Sample Input:

11 11

111 10

10 111

0 0

  11

  11

  --

  11

 11

----

1001

 

 111

  10

 ---

 000

111

----

1110

 

  10

 111

 ---

  10

 10

10

----

1110


這題完全不知道要搞什麼鬼,一堆錯誤題意。

#include <stdio.h>
#include <string.h>

int main() {
    char a[105], b[105];
    int first = 0;
    while(scanf("%s %s", a, b) == 2) {
        if(!strcmp("0", a) && !strcmp("0", b))
            break;
        int la = strlen(a), lb = strlen(b);
        int ans[105][105] = {};
        int i, j, ia, ja;
        for(i = lb-1, ia = 0; i >= 0; i--, ia++) {
            for(j = la-1, ja = 0; j >= 0; j--, ja++) {
                ans[ia][ia+ja] += (b[i]-'0')*(a[j]-'0');
                ans[lb][ia+ja] += ans[ia][ia+ja];
            }
            for(j = 0; j < 100; j++) {
                ans[i][j+1] += ans[i][j]/2;
                ans[i][j] %= 2;
            }
            for(j = 0; j < 100; j++) {
                ans[lb][j+1] += ans[lb][j]/2;
                ans[lb][j] %= 2;
            }
        }
        int mx = la > lb ? la : lb;
        int anslen;
        for(i = 99; i >= 0; i--)
            if(ans[lb][i])  break;
        if(i < 0)   i = 0;
        anslen = i+1;
        if(i+1 > mx)    mx = i+1;
        for(i = 0; i < mx-la; i++)
            putchar(' ');
        puts(a);
        for(i = 0; i < mx-lb; i++)
            putchar(' ');
        puts(b);
        int mx2 = la > lb ? la : lb;
        for(i = 0; i < mx-mx2; i++)
            putchar(' ');
        for(i = 0; i < mx2; i++)
            putchar('-');
        puts("");
        for(i = 0; i < lb; i++, puts("")) {
            for(j = 0; j < mx-i-la; j++)
                putchar(' ');
            for(j = i+la-1; j >= i; j--)
                putchar(ans[i][j]+'0');
        }
        for(i = 0; i < mx; i++)
            putchar('-');
        puts("");
        for(i = 0; i < mx-anslen; i++)
            putchar(' ');
        for(i = anslen-1; i >= 0; i--)
            putchar(ans[lb][i]+'0');
        puts("");
        puts("");
    }
    return 0;
}
/*
11 11
111 10
10 111
0 0
*/