三十六以内某进制下的数转换为另一进制下的数(递归版,迭代版)——秦九昭算法

目录


哎,这个不同于:

三十六以内的进制转换(加注释多多),小程序版


源代码&注释

有两种做法

递归版:
//三十六以内进制转换(递归版) 
#include<cstdio>
#include<cstring>
using namespace std;

int n,m,mid=0,goal=0,tmp,len;
char str[100];

void fac(int x)
{
    if(x==0) return;   //如果第一位数也转换完了,就返回 
    fac(x/m);    //没转换完就进入递归 
    if(x%m<=9)     //判断这位数字是数字还是字母 
        printf("%d",x%m);     //是数字就把数字除后进制数 
    else
        printf("%c",x%m-10+'A');     //是字母还得转化一下(加十是因为A表示10,B表示11......) 
}


void print()
{
    memset(str,0,sizeof(str));
    mid=0,goal=0;   //循环就得把数组,变量先清空 
    printf("...............三十六以内进制转换(By STY)...............\n");
    printf("退出请按 " Ctrl+Z " (在键盘上),并按回车,谢谢使用!\n");
    printf("(  2 <= 所有进制数 <= 36  )\n");
    printf("请输入:(一个进制 该进制下的数 要转换的进制)\n");
}

int main()
{
    print(); 
    while(~scanf("%d%s%d",&n,str,&m))   //这个程序可以循环 
    {
        len=strlen(str);    //计算str字符串的长度 
        for(int i=0;i<len;i++)     //遍历整个数字 
        {
            if(str[i]>='0'&&str[i]<='9')     //如果是数字...... 
                tmp=str[i]-'0';
            else if(str[i]>='A'&&str[i]<='Z')   //大写可以 
                tmp=str[i]-'A'+10;
            else
                tmp=str[i]-'a'+10;     //小写也可以 
            mid=mid*n+tmp;     //秦九昭算法
        }    
        printf("结果:\n");
        if(mid)
            fac(mid);    //如果输入不是'0',进入递归函数 
        else
            printf("0\n");  //是'0'就输出0,(不然会出事,'0'要特判) 
        printf("\n\n");
        print();
    }
    return 0;
}

迭代版:
//三十六以内进制转换(迭代版)  
#include<cstdio>
#include<cstring>   
using namespace std;

int len,shu,yu,n,m,j; 
char shuru[1000],shuchu[1000],a[1000];

void zhuan()
{
    for(j=0;shuru[j]!='\0';j++)   //遍历整个数(字符串结束符'\0') 
    {
        shu*=n;     //将字符串转换为整型变量 
        if(shuru[j]>'9')    //如果字符大于'9',那就是字母 
            shu+=shuru[j]-'A'+10;
        else
            shu+=shuru[j]-'0';   //不是就是数字 
    }
    for(;shu!=0;j++)    //转换整个数字 
    {
        yu=shu%m;
        if(yu>9)
            shuchu[j]=yu+55;
        else                     
            shuchu[j]=yu+48; 
        shu/=m;
    }
    for(int ii=j-1;ii>=0;ii--)    //把数组在转换为字符串(不然字母输出不了)   
        a[j-ii-1]=shuchu[ii]; 
    a[j]='\0';   //字符串要加结束符,不然就是字符数组,用%s输出不了 
    printf("%s\n",a);    //输出
}

void print()
{
    memset(shuru,0,sizeof(shuru));
    memset(shuchu,0,sizeof(shuchu));
    shu=len=yu=0;     //循环就得把数组,变量先清空 
    printf("...............三十六以内进制转换(By STY)...............\n");
    printf("退出请按 Ctrl+Z (在键盘上),并按回车,谢谢使用!\n");
    printf("(  2 <= 所有进制数 <= 36  )\n");
    printf("请输入:(一个进制 该进制下的数 要转换的进制)\n");
}

int main()
{
    print();
    while(~scanf("%d%s%d",&n,shuru,&m))
    {
        len=strlen(shuru);    //计算字符串长度 
        if(len==1&&shuru[0]=='0')     //没有len==1,如果输入'010',还是输出'0' 
        printf("0\n");    //如果没有这一句,数字是'0',输出就什么都没有 
        else
        zhuan();  //引用转换函数 
        print();
    }
    return 0;
}

希望大家喜欢这篇文章!!!
如有问题请留言,谢谢!!!

>>>我的博客<<<

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值