思路:
一、十进制转化为二进制,整数转换,采用基数除法。
基数除法:
将待转换的十进制数除以将转换为新进位制的基数,取其余数,其步骤如下:
1、将待转换十进制数除以新进制数基数R,其余数作为新进位制数的最低为(LSB);
2、将前步所得之商再除以新进制数基数R,记下余数,作为新进制数的次低位;
3、重复步骤 2 ,将每次所得之商除以新进制数基数,记下余数,得到新进制数相应的各位,直到最后相除之商为0,这时的余数即为新进制数的最高位(MSB)。
举个例子,可能会更好理解一点儿:
我们现在是要把十进制整数转换为二进制,则上述的新进制数基数R就为2,假设我们要把225转化为二进制数,如下图:
二、题目要求使用递归思想,则我们需要回忆一下使用递归的三部曲:
(1)找整个递归的终止条件:递归应该在什么时候结束?(相除之商不为0,如果为0,递归就结束了)
(2)找返回值:应该给上一级返回什么信息?(内部打印了,此函数无需返回值)
(3)本级递归应该做什么:在这一级递归中,应该完成什么任务?(输出除2的余数)
递归思想 通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解
#核心思想就是:大事化小
代码1如下:
#include<stdio.h>
void change(int n)
{
if (n > 0)
{
change(n / 2);
printf("%d", n % 2);
}
}
int main()
{
int n = 0;
printf("input number:");
scanf("%d", &n);
printf("%d对应的二进制为: ",n);
change(n);
printf("\n");
return 0;
}
再看一下运行结果哈!
如果还是有点不明白,那就继续往下看喔(照片有点大,电脑上看可能会清楚点)!
递归的详细过程(以输入34为例):
运行结果:
代码稍作改变,你自己梳理一下,找一找限制条件是什么,为什么是这个条件?两个代码有什么区别呢?如果都可以梳理出来,那就没问题啦!
代码2如下:
#include<stdio.h>
void change(int n)
{
if (n > 1)
{
change(n / 2);
}
printf("%d", n % 2);
}
int main()
{
int n = 0;
printf("input number:");
scanf("%d", &n);
printf("%d对应的二进制为: ",n);
change(n);
printf("\n");
return 0;
}
梳理完了吧?我们一起再看一下。
代码1的条件为:n>0;
代码1中当n=0时,什么都不做了,直接返回到调用它地方;
代码2的条件为:n>1;
代码2中当n=1时,跳出if,还要打印1%2的结果;
区别:代码2比代码1要少调用了一次change函数。
结束啦!不知道我有没有说清楚哈,如果哪儿有问题,还请大佬们指出来哈!