非负十进制整数转b进制
一、题目分析
题目:将非负十进制整数n转换成b进制。(其中b=2~16)
分析:非负十进制整数转换成b进制数,实质上就是将非负十进制整数除b取余,再将商重复上述过程,直至商变为0,最终将所有余数倒序输出的过程。
该过程可以通过一个递归函数来模拟,递归结束的条件为n==0,在递归体中为实现商不断的除b取余就要调用自身这个递归函数,将除b的商作为函数的入口参数,不断递归调用,最终实现进制转换。
该过程也可以通过一个非递归函数来模拟,在非递归函数体中可以用一个do while()循环来实现商不断除b取余。
二、递归栈模型
三、调试、测试及运行结果
调试截图:
测试截图:
测试代码:
while(flag)
{
printf("请输入一个十进制非负整数:\n");
scanf("%d", &n);
printf("请输入转换成的进制:\n");
scanf("%d", &b);
printf("十进制数%d对应的%d进制数为:\n", n, b);
if(b==8)
printf("0");
else if(b==16)
printf("0X");
rec(n, b); // 调用递归函数实现进制转换
printf("\n");
printf("是否继续进行:是(1) 否(0)\n");
scanf("%d", &flag);
printf("----------------------------\n");
}
问题:当用户键入的十进制非负整数需要转换成十进制以上的数的时候程序就会出错,原因是进制b大于10,对b取余的结果yushu就有可能大于10,对于大于等于10的余数需要用字母表示
解决办法:将大于等于10的yushu转换成其对应的字母表示
if(yushu<10)
printf("%c", '0'+yushu);
Else
printf("%c", 'A'+yushu-10);
运行结果截图:
(递归)
(非递归)
四、总结
本次作业为递归程序设计,通过利用递归思想设计实现非负十进制整数转换成b进制数,让我更进一步的体会了递归的含义,实践了递归设计的方法,通过对问题的分析,找出递归关系以及递归出口从而就可以对问题进行递归结构设计。由于递归在运行的时候遵循“后调用先返回”的原理,这与栈“先进后出”的特点一致,对于每一个递归问题,我们都可以构建其递归栈模型。