forever33221 发表于 2019-12-5 16:05:29

进制转换问题

如何用C++,把一个9进制的数转化为19进制的数啊(用a~i表示10~18)(小白,希望语句能够易懂一些,谢谢啦)

jackz007 发表于 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 , s                                                            ;
      for(k = 0 ; k < 10 ; k ++) s = '0' + k                                     ;
      for(k = 0 ; k <9 ; k ++) s = 'a' + k                              ;
      for(m= strlen(jiu) , d = 0 , i = 0 ; i < m ; i ++) d = d * 9 + jiu - '0' ;
      for(m = 0 ; d ; d /= 19 , m ++) b = s                              ;
      for(k = 0 ; k < m ; k ++) shijiu = b                            ;
      shijiu = '\0'                                                            ;
      return shijiu                                                               ;
}

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

main(void)
{
      char jiu , shijiu                        ;
      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 = 88888888shijiu = h75hig
jiu = 88888888shijiu = h75hig

C:\Bin>

forever33221 发表于 2019-12-5 21:04:57

jackz007 发表于 2019-12-5 18:58
编译、运行实况:

麻烦问一下,那个66是随便设的是吧,还有那个shijiu的字符串没有初始化的话,传到函数中的应该是什么啊

jackz007 发表于 2019-12-5 21:20:09

      66 不是随便设的,因为最长的整型数 long long 是 64 位,如果把一个 long long 类型的整型数转换成二进制,自然最多需要 64 个字符的存储空间,以便可以保存最长 64 个二进制字符,再加上字符串结束标志,那就是 65 个字符了,那么,65 + 1 就是 66 了。shijiu 是字符串形式的十九进制数,jiu 是字符串形式的九进制数。
      两个函数都有两个输入参数,其中,第一个用来保存转换结果,第二个是字符串形式需要转换的九进制或十九进制数。

forever33221 发表于 2019-12-5 21:41:28

jackz007 发表于 2019-12-5 21:20
66 不是随便设的,因为最长的整型数 long long 是 64 位,如果把一个 long long 类型的整型数转换 ...

好的,懂了,谢谢啦

forever33221 发表于 2019-12-11 15:57:33

jackz007 发表于 2019-12-5 21:20
66 不是随便设的,因为最长的整型数 long long 是 64 位,如果把一个 long long 类型的整型数转换 ...

麻烦问一下,如果我从键盘上输入数字的话,是不需要把十进制转换为九进制,然后再化为十九进制数啊

jackz007 发表于 2019-12-11 16:04:15

本帖最后由 jackz007 于 2019-12-11 16:08 编辑

forever33221 发表于 2019-12-11 15:57
麻烦问一下,如果我从键盘上输入数字的话,是不需要把十进制转换为九进制,然后再化为十九进制数啊

      从键盘读到的是字符串,比如,要求你从键盘上输入 4 位九进制数,你按了 4 下字符 '8',于是,字符串 "8888" 就会作为九进制数的输入 jiu[] 提交给函数 jiu2shijiu(),然后,作为响应,函数就会给出一个十九进制形式的字符串;十九进制数的输入与九进制的道理完全一样。

forever33221 发表于 2019-12-11 16:11:22

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

奥,就是它是读取的输入数字字符的ASCII码值是吧,那为什么我们通常从键盘上输入的自动就是十进制的呢。

jackz007 发表于 2019-12-11 16:14:40

本帖最后由 jackz007 于 2019-12-11 16:16 编辑

forever33221 发表于 2019-12-11 16:11
奥,就是它是读取的输入数字字符的ASCII码值是吧,那为什么我们通常从键盘上输入的自动就是十进制的呢。

      注意,从键盘上原始得到的一定是字符串,之所以是十进制数,那是因为中间有了像 scanf() 这样的函数,这些函数可以按照我们的要求,把字符串转换成 10 进制数。

forever33221 发表于 2019-12-11 16:20:48

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

哦,从键盘上输入的都是原始字符,只不过经过函数转译成我们常用的类型了是吧,那我也只能用scanf接收输入啊,它不会变成十进制吗,有点晕

jackz007 发表于 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) ;# 从键盘读取双精度浮点数输入
      关键是,你必须清楚,你将要获得的信息是什么,是别人按十进制、九进制还是十九进制输入给你的等等。

forever33221 发表于 2019-12-11 16:27:47

jackz007 发表于 2019-12-11 16:26
scanf("%c" , & ch) ; # 从键盘读取单个字符
ch = getchar() ;# 从键盘读取单个字符
scanf("%s" , ...

了解啦,十分感谢
页: [1]
查看完整版本: 进制转换问题