2012年4月3日 星期二

d632: C and S ??

內容 :
    有一天,小明在網路上看到一種神奇的魔法
    根據小明的推測,這種魔法似乎是一種數學布林函數
    這個函數是長這樣的:

    輸入部分:
        A、B和C
    輸出部分:
        S 和 C'

    S = A xor B xor C
    C' = (A and B) or (B and C) or (C and A)
    小明將好多個這種函數當成丸子般串起來

    並且把兩個布林數列代進去
    神奇的事情發生了...
    當A為0010
        B為0011
    所得到的S數列竟然是0101!!!
    //==================
    小明今天想做實驗,看看代入不同的A和B,所得到的S數列是長什麼樣子

輸入說明 :
    給定兩個數列A和B(AB兩者長度皆為32)

輸出說明 :
    S數列

範例輸入 :
00000000000000000000000000001100
00000000000000000000000000001101

範例輸出 :
00000000000000000000000000001100
00000000000000000000000000001101
---------------------------------
00000000000000000000000000011001
****End of Data******************

程式碼 :
#include<stdio.h>

int main()
{
    int i,carry;
    char a[33],b[33],s[33];
    char line[34] = "---------------------------------";
    char end[34] = "****End of Data******************";
    
    while(scanf("%s%s",a,b)==2)
    {
        for(i=0; i<32; i++)
        {
            a[i] -= '0';
            b[i] -= '0';
        }
        
        carry = 0;
        for(i=31; i>-1; i--)
        {
            s[i] = a[i] ^ b[i] ^ carry;
            carry = (a[i] & b[i]) | (b[i] & carry) | (a[i] & carry);
        }
        s[32] = '\0';
        
        for(i=0; i<32; i++)
        {
            a[i] += '0';
            b[i] += '0';
            s[i] += '0';
        }
        printf("%s\n%s\n%s\n%s\n%s\n", a, b, line, s, end);
    }
    
    return 0;
}


http://zerojudge.tw/ShowProblem?problemid=d632

沒有留言:

張貼留言