一、题目分析
将非负十进制整数n转换成b进制。(其中b=2~16)
二、算法设计思路
递归模型:
1、递归出口:即当整数n 等于0时,递归结束。if
(0 == n)
return 0;
2、递归体的函数式:int
change2(f(n), int
b);f(n)=n/b;
递归树的调用过程:
三、程序代码
递归方法:
#include<stdio.h>
#include<windows.h>
//将非负十进制n转换成b进制
char arry[100];
int i = 0;
int change2(int n, int b){
if (0 == n) //当n=0时,退出循环
return 0;
else{
int x = n%b; //将n%b的值存放在x中
n/= b; //此时n变成n/b
if (x < 10){
arry[i] = x+'0'; //定义的字符数组要加上字符0,否则输出为字符的ASCII码值
}
else{
switch (x) //若输入的数大于10,转换为16进制
{
case 10: arry[i] = 'A';
break;
case 11:arry[i] = 'B';
break;
case 12: arry[i] = 'C';
break;
case 13: arry[i] = 'D';
break;
case 14: arry[i] = 'E';
break;
case 15: arry[i] = 'F';
break;
default:
break;
}
}
i++;
change2(n, b);//再次进入递归体中
}
}
int main(){
printf("请输入十进制数和转化为几进制:");
int n;
int b;
scanf_s("%d %d", &n, &b);
change2(n,b);
for (int j = i - 1; j >= 0;j--){
printf("%c", arry[j]); //逆序输出函数
}
printf("\n");
system("pause");
return 0;
}
非递归方法:
int main(){
printf("请输入十进制数和转化为几进制:");
int m; //输入的十进制数
int r;//几进制
int n;
scanf_s("%d %d", &m,&r);
if (0==m){
printf("0");
}
int arr[32];//定义一个整型数组
int i = 0;
int b; //保存m%r余数的值
while (m != 0){
b = m%r;
arr[i++] = b;//将余数放到数组中
m = m / r;
}
while (i>0)
{
n= arr[--i];
if (n<10)
printf("%d", n);
else
switch (arr[i]){
case 10:
printf("A");
break;
case 11:printf("B");
break;
case 12:printf("C");
break;
case 13:printf("D");
break;
case 14:printf("E");
break;
case 15:printf("F");
break;
default:
printf("%d", arr[i]);
}
}
printf("\n");
system("pause");
return 0;
}
2、测试结果
1、输入小于10的数将其转换为2进制
2、输入大于10的数,将其转换为16进制
3、输入数字将其转换为8进制
五、经验总结
十进制的数转成二进制,最常用的方法,就是除b取余法,将十进制的数n除以b取其余数,这里得到的余数是b进制数的最后一位。比如:7转化为2进制,先用7%2得到的是1,这里的1是转化后的二进制数的最后一位,再接着,令n=n/b,即为除得的整数结果, n=7/2=3;再同以上的方法将,3%2=1作为2进制数的倒数第二位。以此类推,2进制数的倒数第三位等于3/2%2=1;这时n=0了,循环到此终止,二进制的数为111,代码实现时需要逆序输出(这里很容易想到用数组来存取每一个余数)。若b进制的数共有X位,令n=X-1;n往下移动一位一直到n=0,对数组进行输出。递归函数最重要的就是递归出口和递归体函数,所以在做题目时,一定要明确这两个的内容。