将十进制正整数m转换成进k(2<=k<=9)制数,并按位输出(带解析版)

 首先上代码

#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的操作啦

结语

  以上纯属个人见解,如果有误,还望各位斧正。如果这个还有什么问题不懂,可以评论区留言哦。

猜你喜欢

转载自blog.csdn.net/Leihaifei/article/details/127612506