題目原文
題目內容
IBM (International Beautiful Machines)公司發明了一種小玩意兒叫做「愛的算命機」。這台機器會回答你是否非常渴望愛情。這機器運作的情形是:請你輸入一僅含0和1的字串(稱為S),機器自己則定義一僅含0和1的字串(稱為L,Love的意思)。然後機器不斷的用S去減L(當然是2進位的減法),如果最後可以得到S=L,代表S是用Love做成的。如果最後L>S,代表S不是用Love做成的。
舉例說明:假設S="11011",L="11"。如果我們不斷的從S減去L,我們可以得到:11011、11000、10101、10010、1111、1100、1001、110、11。所以我們得到L了,也就是S是用Love做的。由於愛的算命機的某些限制,字串不可以有以0為開頭的,也就是說"0010101"、"01110101"、"011111"這些字串都是不合法的。另外,只有一個位元的字串也是不合法的。
輸入說明:
輸入的第一列有一個整數N(N<10000),代表以下有幾組測試資料。每組測試資料2列,代表S1和S2字串,其長度都不會超過30個字元。你可以假設所有的字串都是合法的。輸出說明:
對每一組測試資料輸出以下其中之一:
Pair #p: All you need is love! Pair #p: Love is not all you need!在這裡p代表這是第幾組測試資料。如果S1和S2至少可以找到一個合法的L,使得S1和S2都可以用Love做成,則輸出第一種訊息。否則,請輸出第二種訊息。請參考Sample Output。
Sample Input
5 11011 11000 11011 11001 111111 100 1000000000 110 1010 100
Sample Output
Pair #1: All you need is love! Pair #2: Love is not all you need! Pair #3: Love is not all you need! Pair #4: All you need is love! Pair #5: All you need is love!
解法
使用字串把要互相比較的兩個值讀進來,之後再把它們二進位的值轉成十進位,之後再看他們是不是互值。如果是互值就印Love is not all you need!,反之印All you need is love!。
(注意:資料是兩筆兩筆一組的)
(以上資料來源:大學程式能力檢定Collegiate Programming Examination(CPE))
程式碼解答
#include <stdio.h> int bin2sec()//二進位轉換成十進位 { char s[32]; int n, i; scanf("%s" ,s); for(i=0,n=0; s[i]!='\0'; i++){ n=n*2+(s[i]-'0');} return n; } int main() { int n, i, x, y, z; scanf("%d\n", &n); for(i=1; i<=n; i++) { x=bin2sec(); y=bin2sec(); while(y>0)//輾轉相除法求出公因數 { z=x%y; x=y; y=z; } if(x>1)//依照題意列印 printf("Pair #%d: All you need is love!\n", i); else printf("Pair #%d: Love is not all you need!\n", i); } } |
沒有留言:
張貼留言