递归

1、算法思路设计

将非负十进制整数n转换成b进制

递归出口:n=0;

递归体:  f(n/b,s,b);

先进行整除运算n=n/b。整除结果作为下一次的n,求余运算n%b,把该位进制数结果存入数组an中。
从后往前输出数组元素。如果数组元素小于10,照原样输出;如果数组元素大于等于10,输出其相应的符号, 10输出A,11输出B等等

以6位例,递归栈为:

2、代码

#include<iostream>
#include<string.h>
using namespace std;
void f(int n,char* s,int b)
{
    static int i;//字符串下标 
    if(0==n)
      {
          s[0]='0';
          s[1]='\0';
          i=0;
          return;
      }
      else if(n<0)
      {
          s[0]='-';//第一位存符号 
          n=-n;//取绝对值 
          i=1;//从1开始保存数 
      }
    char an[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
    if(n!=0)
    {
        f(n/b,s,b);//n/b作为第二次的n 
        s[i++]=an[n%b];//进制转换计算过程,求余n%b,读取字符 
        s[i]='\0';
    }
 } 
 void ff(int n,char* s,int b)
 {
  static char bchar[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
      int i=0;
      if(0==n)
      {
          s[0]='0';
          s[1]='\0';
          return;
      }
      else if(n<0)
      {
          s[0]='-';
          n=-n;
          i=1;
      }
      while(0!=n)
      {
          s[i++]=bchar[n%b];
          n=n/b;
      }
      s[i]='\0';
      int max=strlen(s)-1;
      int min=s[0]=='-'?1:0;
      //将字符串逆序 
      while(min<max)
      {
          char t=s[min];
          s[min]=s[max];
          s[max]=t;
          
          min++;
          max--;
      }
 }
 
 int main()
 {
     char s[50];
     char s1[50];
     int in,turn;
     cout<<"输入一个数:"<<endl;
     cin>>in;
     cout<<"你想将它转为几进制:"<<endl;
     cin>>turn;
     f(in,s,turn);
     ff(in,s1,turn);
     
     cout<<"递归求解结果:"<<endl;
     cout<<s<<endl;
     cout<<"非递归求解结果:"<<endl;
         cout<<s1<<endl;
     
     return 0;
 }
 
 
 3、截屏

4、总结

将非负十进制整数n转换成b进制就是,n除以b取余作为转换后的数的低位,在n/b后不为0的情况下,继续除以b,取余作为次低位,直到n为0为止。在这个题中还要注意,n的正负性,如果n为负数,要先判断s[0]是否为-,若是,就将它转换后的进制数从s[1]开始存数,第一位保存字符位。在主函数中,定义一个字符串数组,整个过程以数组衔接,作为存取栈,在函数中设置一个数组an[]作为进制取余后要给s[i++]里存的数,i++不断扩展栈内存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值