鱼C论坛

 找回密码
 立即注册
查看: 1403|回复: 11

[已解决]进制转换问题

[复制链接]
发表于 2019-12-5 16:05:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
如何用C++,把一个9进制的数转化为19进制的数啊(用a~i表示10~18)(小白,希望语句能够易懂一些,谢谢啦)
最佳答案
2019-12-5 18:58:51
#include <stdio.h>
#include <string.h>

char * jiu2shijiu(char * shijiu , char * jiu)
{
        int d , i , k , m                                                             ;
        char b[66] , s[19]                                                            ;
        for(k = 0 ; k < 10 ; k ++) s[k] = '0' + k                                     ;
        for(k = 0 ; k <  9 ; k ++) s[10 + k] = 'a' + k                                ;
        for(m  = strlen(jiu) , d = 0 , i = 0 ; i < m ; i ++) d = d * 9 + jiu[i] - '0' ;
        for(m = 0 ; d ; d /= 19 , m ++) b[m] = s[d % 19]                              ;
        for(k = 0 ; k < m ; k ++) shijiu[k] = b[m - 1 - k]                            ;
        shijiu[m] = '\0'                                                              ;
        return shijiu                                                                 ;
}

char * shijiu2jiu(char * jiu , char * shijiu)
{
        int d , i , k , m                                                             ;
        char b[66]                                                                    ;
        for(m = strlen(shijiu) , d = 0 , i = 0 ; i < m ; i ++) {
                if(shijiu[i] > '9') d = d * 19 + shijiu[i] - 'a' + 10                 ;
                else d = d * 19 + shijiu[i] - '0'                                     ;
        }
        for(m = 0 ; d ; d /= 9 , m ++) b[m] = '0' + d % 9                             ;
        for(k = 0 ; k < m ; k ++) jiu[k] = b[m - 1 - k]                               ;
        jiu[m] = '\0'                                                                 ;
        return jiu                                                                    ;
}

main(void)
{
        char jiu[66] , shijiu[66]                        ;
        strcpy(jiu , "88888888")                         ;
        jiu2shijiu(shijiu , jiu)                         ;
        printf("jiu = %s\tshijiu = %s\n" , jiu , shijiu) ;
        shijiu2jiu(jiu , shijiu)                         ;
        printf("jiu = %s\tshijiu = %s\n" , jiu , shijiu) ;
}
        编译、运行实况:
C:\Bin>g++ -o jiu jiu.c

C:\Bin>jiu
jiu = 88888888  shijiu = h75hig
jiu = 88888888  shijiu = h75hig

C:\Bin>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-12-5 18:58:51 | 显示全部楼层    本楼为最佳答案   
#include <stdio.h>
#include <string.h>

char * jiu2shijiu(char * shijiu , char * jiu)
{
        int d , i , k , m                                                             ;
        char b[66] , s[19]                                                            ;
        for(k = 0 ; k < 10 ; k ++) s[k] = '0' + k                                     ;
        for(k = 0 ; k <  9 ; k ++) s[10 + k] = 'a' + k                                ;
        for(m  = strlen(jiu) , d = 0 , i = 0 ; i < m ; i ++) d = d * 9 + jiu[i] - '0' ;
        for(m = 0 ; d ; d /= 19 , m ++) b[m] = s[d % 19]                              ;
        for(k = 0 ; k < m ; k ++) shijiu[k] = b[m - 1 - k]                            ;
        shijiu[m] = '\0'                                                              ;
        return shijiu                                                                 ;
}

char * shijiu2jiu(char * jiu , char * shijiu)
{
        int d , i , k , m                                                             ;
        char b[66]                                                                    ;
        for(m = strlen(shijiu) , d = 0 , i = 0 ; i < m ; i ++) {
                if(shijiu[i] > '9') d = d * 19 + shijiu[i] - 'a' + 10                 ;
                else d = d * 19 + shijiu[i] - '0'                                     ;
        }
        for(m = 0 ; d ; d /= 9 , m ++) b[m] = '0' + d % 9                             ;
        for(k = 0 ; k < m ; k ++) jiu[k] = b[m - 1 - k]                               ;
        jiu[m] = '\0'                                                                 ;
        return jiu                                                                    ;
}

main(void)
{
        char jiu[66] , shijiu[66]                        ;
        strcpy(jiu , "88888888")                         ;
        jiu2shijiu(shijiu , jiu)                         ;
        printf("jiu = %s\tshijiu = %s\n" , jiu , shijiu) ;
        shijiu2jiu(jiu , shijiu)                         ;
        printf("jiu = %s\tshijiu = %s\n" , jiu , shijiu) ;
}
        编译、运行实况:
C:\Bin>g++ -o jiu jiu.c

C:\Bin>jiu
jiu = 88888888  shijiu = h75hig
jiu = 88888888  shijiu = h75hig

C:\Bin>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-5 21:04:57 | 显示全部楼层
jackz007 发表于 2019-12-5 18:58
编译、运行实况:


麻烦问一下,那个66是随便设的是吧,还有那个shijiu的字符串没有初始化的话,传到函数中的应该是什么啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-5 21:20:09 From FishC Mobile | 显示全部楼层
        66 不是随便设的,因为最长的整型数 long long 是 64 位,如果把一个 long long 类型的整型数转换成二进制,自然最多需要 64 个字符的存储空间,以便可以保存最长 64 个二进制字符,再加上字符串结束标志,那就是 65 个字符了,那么,65 + 1 就是 66 了。shijiu 是字符串形式的十九进制数,jiu 是字符串形式的九进制数。
        两个函数都有两个输入参数,其中,第一个用来保存转换结果,第二个是字符串形式需要转换的九进制或十九进制数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-5 21:41:28 | 显示全部楼层
jackz007 发表于 2019-12-5 21:20
66 不是随便设的,因为最长的整型数 long long 是 64 位,如果把一个 long long 类型的整型数转换 ...

好的,懂了,谢谢啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-11 15:57:33 | 显示全部楼层
jackz007 发表于 2019-12-5 21:20
66 不是随便设的,因为最长的整型数 long long 是 64 位,如果把一个 long long 类型的整型数转换 ...

麻烦问一下,如果我从键盘上输入数字的话,是不需要把十进制转换为九进制,然后再化为十九进制数啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-11 16:04:15 | 显示全部楼层
本帖最后由 jackz007 于 2019-12-11 16:08 编辑
forever33221 发表于 2019-12-11 15:57
麻烦问一下,如果我从键盘上输入数字的话,是不需要把十进制转换为九进制,然后再化为十九进制数啊


      从键盘读到的是字符串,比如,要求你从键盘上输入 4 位九进制数,你按了 4 下字符 '8',于是,字符串 "8888" 就会作为九进制数的输入 jiu[] 提交给函数 jiu2shijiu(),然后,作为响应,函数就会给出一个十九进制形式的字符串;十九进制数的输入与九进制的道理完全一样。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-11 16:11:22 | 显示全部楼层
jackz007 发表于 2019-12-11 16:04
从键盘读到的是字符串,比如,要求你从键盘上输入 4 位九进制数,你按了 4 下字符 '8',于是,字 ...

奥,就是它是读取的输入数字字符的ASCII码值是吧,那为什么我们通常从键盘上输入的自动就是十进制的呢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-11 16:14:40 | 显示全部楼层
本帖最后由 jackz007 于 2019-12-11 16:16 编辑
forever33221 发表于 2019-12-11 16:11
奥,就是它是读取的输入数字字符的ASCII码值是吧,那为什么我们通常从键盘上输入的自动就是十进制的呢。


        注意,从键盘上原始得到的一定是字符串,之所以是十进制数,那是因为中间有了像 scanf() 这样的函数,这些函数可以按照我们的要求,把字符串转换成 10 进制数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-11 16:20:48 | 显示全部楼层
jackz007 发表于 2019-12-11 16:14
注意,从键盘上原始得到的一定是字符串,之所以是十进制数,那是因为中间有了像 scanf() 这样 ...

哦,从键盘上输入的都是原始字符,只不过经过函数转译成我们常用的类型了是吧,那我也只能用scanf接收输入啊,它不会变成十进制吗,有点晕
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-11 16:26:21 | 显示全部楼层
本帖最后由 jackz007 于 2019-12-11 16:30 编辑
forever33221 发表于 2019-12-11 16:20
哦,从键盘上输入的都是原始字符,只不过经过函数转译成我们常用的类型了是吧,那我也只能用scanf接收输 ...


        从键盘获取信息的途径有很多,下面的都是
scanf("%c" , & ch) ; # 从键盘读取单个字符  
ch = getchar() ;  # 从键盘读取单个字符 
scanf("%s" , s) ;  # 从键盘读取字符串
s = fgets(s , 1024 , stdin) ;  # 从键盘读取最长不超过 1024 个字符的字符串
scanf("%d" , & v) ;  # 按十进制从键盘接收整型数输入
scanf("%x" , & v) ;  # 按十六进制从键盘接收整型数输入
scanf("%o" , & v) ;  # 按八进制从键盘接收整型数输入
scanf("%f" , & v) ;  # 从键盘读取浮点数输入
scanf("%lf" , & v) ;  # 从键盘读取双精度浮点数输入
        关键是,你必须清楚,你将要获得的信息是什么,是别人按十进制、九进制还是十九进制输入给你的等等。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-11 16:27:47 | 显示全部楼层
jackz007 发表于 2019-12-11 16:26
scanf("%c" , & ch) ; # 从键盘读取单个字符  
ch = getchar() ;  # 从键盘读取单个字符
scanf("%s" , ...

了解啦,十分感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-5 01:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表