首先上代码
#include<stdio.h>
void switchBase (int n, int k) {
int arr[20], i;
//这里用n,因为在for循环表达式中,第二个参数为真的时候就会执行,显然这里如果使用i<n,i<=n,那么就得不到想要的结果了
for (i = 0; n; i++)
{
arr[i] = n % k;
n /= k;
}
//当执行到了这里时,i++也被执行了一次
for (; i; i--) {
printf("%d", arr[i - 1]);
}
}
int main() {
int n, k=0;
scanf("%d %d", &n, &k);
switchBase(n, k);
return 0;
}
我带着大家逐步进行分析一下
问题1:为什么第一次for循环中的第二个表达式是n,而不是i<=m的条件
因为在for循环表达式中,只有第二个表达不为0,即为真的时候才会执行下去。
假设我们用这个条件执行代码
for (i = 0; i<=n; i++)
{
arr[i] = n % k;
n /= k;
}
那么一旦这个循环变量的值i大于n了那么后面的代码都不会执行下去了。如果是大数字要进行二进制的准换呢?不言而喻,用上这个表达式得不到想要的进制准换结果。
还是不太理解嘛?没事,举个例子你就懂了
假设输入一个十进制的整数10,需要转换成对应的二进制数
这个结果是表达式n的结果
for (i = 0;n; i++)
{
arr[i] = n % k;
n /= k;
}
假设用上表达式2
for (i = 0;n; i++)
{
arr[i] = n % k;
n /= k;
}
这里我们观察一下,前面的执行结果跟表达式1相同,但是到了i为2的时候,n的值为1了,这个时候后面的代码就执行不了。而在进制转换中,这个1还是可以继续转换的。
问题二:
为何没在逆序打印转换后的进制数时需要去arr[i-1]
这是因为在for循环遍历时,当n的值为0的时候执行了一次++的操作,此时i的值是大于数组长度一位。
举个例子,同样是10进制的整数10转换二进制数
我打印了一下i的值,虽然执行了四次循环,但是值为4 。
所有在进行逆序输出的时候,就需要减1的操作啦
结语
以上纯属个人见解,如果有误,还望各位斧正。如果这个还有什么问题不懂,可以评论区留言哦。