将非负十进制数转换为b进制数递归与非递归

一、题目分析
将非负十进制整数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,对数组进行输出。递归函数最重要的就是递归出口和递归体函数,所以在做题目时,一定要明确这两个的内容。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值