2010年3月8日 星期一

Problem 389 Basically Speaking,位元轉換

此題需使用 %s %d %d 以str、sc、ec接收資料,字串為初始的 sc 進位,要將它轉成 ec 進位。

當讀入字串後,將它轉成 10 進位:
int i, j, length, num = 0;
length = strlen(str);
for (i = length - 1; i >= 0; i --)
intArray[length - 1 - i] = charToInt(str[i]);
for (i = 0, j = 1; i < length; i ++, j *= sc)
num += intArray[i] * j;

其中有一個 int charToInt(char) 函式,可以將 char 轉為 int,也要寫一個char intToChar(int)的函式,等等會用到:
int charToInt(char hex)
{
if (hex == 'A') return 10;
else if (hex == 'B') return 11;
else if (hex == 'C') return 12;
else if (hex == 'D') return 13;
else if (hex == 'E') return 14;
else if (hex == 'F') return 15;
else return (hex - '0');
}

char intToChar(int i)
{
if (i == 10) return 'A';
else if (i == 11) return 'B';
else if (i == 12) return 'C';
else if (i == 13) return 'D';
else if (i == 14) return 'E';
else if (i == 15) return 'F';
else return (i + '0');
}

再來需構寫一個印出的函式,首先需判斷此數除以 ec7 是否大於 0,若大於 0,則會超出顯示器顯示,若不大於 0,則以 ec6、ec5、....等累除,但記得需要靠右 7 隔,所以某些地方需要印出空白:
void print(int num)
{
int i, j, isPut = 0;
if (num == 0) printf("0");
else if (num / pow(ec, 7) > 0) printf("ERROR");
else
{
for (i = pow(ec, 6); i >= 1; i /= ec)
{
if (isPut) printf("%c", intToChar(num / i)), num %= i;
else if (num / i > 0 && !isPut)
printf("%c", intToChar(num / i)), num %= i, isPut = 1;
else printf(" ");
}
}
printf("\n");
}

最後只需再主程式呼叫 print(int) 即可。
By David.K

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

沒有留言: