2008年3月19日 星期三

Problem 10019 Funny Encryption Method,有趣的密碼編碼

這個ACM題目看起來又臭又長,其實只有兩個重點,將一個數字N,看成10進位與16進位的數字,然後分別進行10進位轉換2進位,與16進位轉換2進位,然後將這兩個二進位的數字中的 1 進行加總,再分別列印出來。
這兩個要求在C語言中可以用 stdlib.h中的itoa()輕易解決。在Dev C++中,用itoa(N, X1, 2)可以求得二進位字串。但是,ACM的裁判系統找不到itao函數,而產生compile error,這段過程是很令人氣結的。

解決之道是我自己再寫一個函數:srt2bin(),將數字字串s,經過以base為底換算成十進位後,再轉換成二進位的字串。存在字串 b 中。數字字元與一般整數型態轉換,必須加減 48 。
void str2bin(char s[], char b[], int base)
{
int i, j, sum=0, prod, len=strlen(s);
char temp[20];
for (i=0;i<len;i++)
{
prod=1;
for (j=len-i-1;j>0;j--)
prod *= base;
sum += prod * (s[i]-48);
}
i = 0;
while (sum!=0)
{
b[i] = sum%2+48;
sum /= 2;
i++;
}
b[i] = '\0';
}

p10019題目連結
回ACM題庫目錄
回首頁

1 則留言:

aren 提到...

直接用int處理會不會比較好
貌似沒有用到字串的需要