#include <stdio.h>
#include <string.h>
// 反转字符串
void reverse(char str[]) {
int len = strlen(str);
for (int i = 0; i < len / 2; i++) {
char temp = str[i];
str[i] = str[len - i - 1];
str[len - i - 1] = temp;
}
}
void trans(int n, int base, char a[]) {
int i = 0;
while (n > 0) {
int digit = n % base;
if (digit < 10) {
a[i] = digit + '0';
} else {
a[i] = digit - 10 + 'A';
}
n /= base;
i++;
}
a[i] = '\0';
reverse(a); // 反转字符串以修正顺序
}
int main() {
int n;
char binary[32], octal[32], hexdecimal[32];
scanf("%d", &n);
trans(n, 2, binary);
trans(n, 8, octal);
trans(n, 16, hexdecimal);
printf("%s\n", binary);
printf("%s\n", octal);
printf("%s\n", hexdecimal);
return 0;
}
在转换为八进制时,结果的顺序是反的。这是因为我们在计算八进制时,是从最低位开始计算的,但是在存储结果时,却是从最高位开始存储的。这导致了结果的逆序。
结果
让我们以一个例子来解释这个 trans
函数。假设我们要将十进制数 123
转换为八进制和十六进制。
int n = 123;
char octal[32]; // 存储八进制结果
char hexadecimal[32]; // 存储十六进制结果
trans(n, 8, octal); // 调用 trans 函数将十进制数转换为八进制
trans(n, 16, hexadecimal); // 调用 trans 函数将十进制数转换为十六进制
现在我们来分析 trans
函数的执行过程:
-
当
n
的值为123
,base
的值为8
时,trans
函数将开始执行。初始时,i
的值为0
。 -
第一次循环中,
digit
的值为123 % 8 = 3
,因为123
除以8
的余数是3
。由于3
小于10
,所以a[0]
的值将被设为'3'
。 -
接着,
n
的值更新为123 / 8 = 15
。i
的值增加为1
。 -
第二次循环中,
digit
的值为15 % 8 = 7
,因为15
除以8
的余数是7
。同样,7
小于10
,所以a[1]
的值将被设为'7'
。 -
接着,
n
的值更新为15 / 8 = 1
。i
的值增加为2
。 -
第三次循环中,
digit
的值为1 % 8 = 1
,因为1
除以8
的余数是1
。同样,1
小于10
,所以a[2]
的值将被设为'1'
。 -
现在
n
的值变为0
,循环结束。此时a[3]
被设置为结束符'\0'
,以表示字符串的结束。 -
因此,
octal
数组中存储的字符串为"173"
,这是123
的八进制表示。
接下来,我们来看十六进制的转换过程:
-
当
n
的值为123
,base
的值为16
时,trans
函数将开始执行。初始时,i
的值为0
。 -
第一次循环中,
digit
的值为123 % 16 = 11
,因为123
除以16
的余数是11
。由于11
大于等于10
,所以a[0]
的值将被设为'B'
(对应十六进制中的11
)。 -
接着,
n
的值更新为123 / 16 = 7
。i
的值增加为1
。 -
第二次循环中,
digit
的值为7 % 16 = 7
,因为7
除以16
的余数仍然是7
。同样,7
小于10
,所以a[1]
的值将被设为'7'
。 -
接着,
n
的值更新为7 / 16 = 0
。i
的值增加为2
。 -
现在
n
的值变为0
,循环结束。此时a[2]
被设置为结束符'\0'
,以表示字符串的结束。 -
因此,
hexadecimal
数组中存储的字符串为"7B"
,这是123
的十六进制表示。
通过这个例子,我们可以看到 trans
函数是如何将十进制数转换为其他进制表示的字符串的。