思路
取余倒排序
将数字每次除以进制数的余数打印,但这样不是倒排序,通过将打印操作写在调用递归函数下面,可以在每次调用递归函数时将打印操作存起来。
在达到边界后(最后一次调用)所有存起来的操作都会从最后一个开始一步步执行。
十六进制稍微有一点点变化,多一个余数10 ~ 15表示为A ~ F的步骤,但思路一致。
事例
(片段,完整的在下面,a为十位数,n为要转换的进制):
if(a==0)
return;
else
{
zhuanhuan(a/n,n);
printf("%d",a%n);
}
输入的数如果是0则停止,否则执行两步操作:
1.调用自身
2.打印余数
在执行第一步后每次调用自身里面都会再次调用自身,一直套娃直到数为0,所次每次调用自身第二步都会存起来。
如果a=4,n=2,
a不等于0,调用zhuanhuan(2,2),打印0的操作先存着。
在zhuanhuana(2,2)中a不等于0,调用zhuanhuan(1,2),打印0的操作先存着。
在zhuanhuana(1,2)中a不等于0,调用zhuanhuan(0,2),打印1的操作先存着。
在zhuanhuana(0,2)中a等于0,停止。
从最后一个开始执行存着的操作
打印1
打印0
打印0
所以4的二进制为100
代码
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a,n;
scanf("%d%d",&a,&n);
zhuanhuan(a,n);
return 0;
}
void zhuanhuan(int a,int n)
{
if(n==2||n==8)
if(a==0)
return;
else
{
zhuanhuan(a/n,n);
printf("%d",a%n);
}
else if(n==16)
if(a==0)
return;
else
{
zhuanhuan(a/n,n);
if(a%n>=10)
printf("%c",a%n+55);
else
printf("%d",a%n);
}
}