问题描述

题目描述
将M进制的数X转换为N进制的数输出。

输入
输入的第一行包括两个整数:M和N(2<=M,N<=36)。
下面的一行输入一个数X,X是M进制的数,现在要求你将M进制的数X转换成N进制的数输出。

输出
输出X的N进制表示的数。

样例输入
10 2
11
样例输出
1011
提示
注意输入时如有字母,则字母为大写输出时如有字母,则字母为小写

思路分析

我们知道大整数不能转换为一个整数然后用普通的进制转换,我们可以借助普通进制转换的思路来进行转换。
我们可以先来了解一下普通进制转换:
假如我们要把10进制数1234转换为7进制

  1. 1234/7=167,余2
  2. 167/7=25,余1
  3. 25/7=3,余4
  4. 3/7=0,余3

所以转换得到7进制数3412
那么我们的大整数进制转换也可以通过上述思路来进行。两者的区别就在于我们需要用数组一位位的除,以第1步为例,即不能直接用1234来除7,得用数组1234来除。

M进制转N进制具体思路如下:
  从高位到低位,每一位除以N,商用作该位新的值,余数乘以M加上下一位用于更新下一位,直到最后一位,把余数取出来存放到一个新的数组里。
1234为例,定义一个ans[]数组存放进制转换后的结果。

  1. 第1位是1,1/7=0,余1,所以第1位更新为0,余数1用于第2位;
  2. 第2位是2,更新为1×10+2=12,然后12/7=1,余5,所以第2位更新位1,余数5用作第3位;
  3. 第3位是3,更新为5×10+3=53,然后53/7=7,余4,所以第3位更新为7,余数4用作第4位;
  4. 第4位是4,更新为4×10+4=44,然后44/7=6,余2,所以第4位更新为6,余数为2,因为已经是最后一位了,所以提取2,存放到a[0]中。
  5. 此时的数组更新为0176,然后重复上述4个步骤,直至数组更新为0000。得到的ans数组进行逆序输出即为进制转换后的结果。

代码操作

在具体代码时,有这么一个问题,输出有可能是大于9的数,所以会用到abcd这些字母来表示9以后的数,那该怎么操作呢?有一个方法就是定义一个字符数组来顺序存放26个英文字母,比如11是b,我们就可以把数组的第11位存放为b,把第0到第9位存放0-9。这样在往ans数组里存放结果的时候,就不存余数,而是存放以余数为下标的字符,即定义这么一个字符数组:

char map[40]="0123456789abcdefghijklmnopqrstuvwxyz";

这样当我们输出就是map[余数]

针对该题,我写的代码具体思路如下:

定义字符数组str[]来存放读入的大整数,定义整型数组a[]来存放str转换为整型,定义字符数组ans[]来存放最后的结果

char ans[maxn],str[maxn];
int a[maxn];

读入大整数str,若str长度为1,且值为0,那么输出0;否则进行接下来的操作。

int len=strlen(str);
if(len==1&&str[0]=='0'){printf("0\n");continue;
}

接下来将str转换为整型来存放在a中。

for(int i=0;i<len;i++){if(str[i]>='A'&&str[i]<='Z') a[i]=str[i]-'A'+10;else a[i]=str[i]-'0';
}

接下来就是将M进制的a转换为N进制的ans了,根据上面的思路我们要取余存放,代码如下。

//这里从高位往低位除n进制,用point暂存每一次除法的余数,用作下一位,并更新a[i]
for(int i=0;i<len;i++){a[i]=a[i]+point*m;point=a[i]%n;a[i]=a[i]/n;
}
//取最后一位的余数
sum=point;
ans[j++]=map[sum];
//将进位余数归0,用于下一次计算
point=0;

上面的代码只是一次取余的操作,我们要进行多次,就需要循环,循环就需要循环进行或终止的条件,我们根据上面的思路可知,当更新后的a每一位都为0时,循环停止,那就可以这么定义循环条件

int j=0;//j用于ans的下标
int sum,point=0;//sum最终余数,point每一位余数
int answer=1;
while(1){//answer作为循环是否进行的条件,当所有a[i]均为0时,循环停止answer=0;for(int i=0;i<len;i++){if(a[i]!=0){answer=1;break;}}if(answer==0) break;//这里从高位往低位除n进制,用point暂存每一次除法的余数,用作下一位,并更新a[i]for(int i=0;i<len;i++){a[i]=a[i]+point*m;point=a[i]%n;a[i]=a[i]/n;}//取最后一位的余数sum=point;ans[j++]=map[sum];//将进位余数归0,用于下一次计算point=0;
}

最后逆序输出ans。

for(int i=j-1;i>=0;i--){printf("%c",ans[i]);
}

最终代码

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>const int maxn=1020;
char map[40]="0123456789abcdefghijklmnopqrstuvwxyz";int main(){//str存储输入的字符串,ans存储表示的数值char ans[maxn],str[maxn];int a[maxn];int m,n;while(~scanf("%d %d",&m,&n)){memset(ans,0,sizeof(ans));memset(a,0,sizeof(a));scanf("%s",str);int len=strlen(str);if(len==1&&str[0]=='0'){printf("0\n");continue;}//str转换到ansfor(int i=0;i<len;i++){if(str[i]>='A'&&str[i]<='Z') a[i]=str[i]-'A'+10;else a[i]=str[i]-'0';}int j=0;int sum,point=0;//sum最终余数,point每一位余数int answer=1;while(1){//answer作为循环是否进行的条件,当所有a[i]均为0时,循环停止answer=0;for(int i=0;i<len;i++){if(a[i]!=0){answer=1;break;}}if(answer==0) break;//这里从高位往低位除n进制,用point暂存每一次除法的余数,用作下一位,并更新a[i]for(int i=0;i<len;i++){a[i]=a[i]+point*m;point=a[i]%n;a[i]=a[i]/n;}//取最后一位的余数sum=point;ans[j++]=map[sum];//将进位余数归0,用于下一次计算point=0;}for(int i=j-1;i>=0;i--){printf("%c",ans[i]);}printf("\n");}return 0;
}

整个思路我都已经写得非常清楚了,希望可以帮到大家,也用于自己日后复习的时候可以看看。

简单易懂,过程详述大整数进制转换相关推荐

  1. c语言2进制16进制 表格,标题:整数进制转换(十六进制,十进制,二进制)--表格法...

    标题:整数进制转换(十六进制,十进制,二进制)--表格法 在计算机里,最基本的存储单位为字节(Byte,常说的大B),1个字节包含8位(bit,常说的小b).计算机的数据就是一个字节一个字节的形式存储 ...

  2. 1.1_简单递归 (汉诺塔问题 / 进制转换)

    --- 递归三定律 ---1. 基本结束条件,解决最小规模问题2. 缩小规模,向基本结束条件演进3. 调用自身来解决已缩小规模的相同问题 递归实例:汉诺塔问题 n 个盘子时:1. 把 n-1 个圆盘从 ...

  3. linux 大数字 进制转换,Linux下用bc快速进行数字进制转换

    介绍如何在Linux下用bc命令进行快速的数字进制转换. 我想Windows里,数字进制转换最方便的就是自带的calc计算器,但是它原没有我们可爱的Linux方便.Linux下,我们在term里敲 几 ...

  4. 关于C语言的一个简单工具类(包含常用进制转换和CRC,MD5,BBC)

    目录 一. 前言 二. 进制转换和格式控制 十进制转为十六进制函数 十六进制字符串转换成十六进制数组 把字符串中的空格符号删除 比较两个数组之间是否相同 命令响应数据中查找关键字 16位数据高低字节互 ...

  5. 练习:自撸整数进制转换器(二、八、十六进制转十进制)

    我的CSDN主页 My Python 学习个人备忘录 我的HOT博 整数进制转换器(二.八.十六进制转十进制) 题目 代码运行效果 我的解题思路 转换器完整代码 题目   跟着寒佬整数进制转换,生发自 ...

  6. 基于MATLAB的进制转换

    1.常用进制转换方法(除k取余法) (1)十进制与二进制之间的转换 方法:除2取余法,即每次将整数部分除以2,余数为该位权上的数,而商继续除以2,余数又为上一个位权上的数,这个步骤一直持续下去,直到商 ...

  7. 微信小程序蓝牙BLE开发——关于进制转换(四)

    微信小程序蓝牙BLE开发--进制转换 这段时间开发共享设备,对接蓝牙BLE设备通信协议,过程中用到一些进制转换, 记录下方便使用. 有些参考大神们,感谢分享. 文章目录 微信小程序蓝牙BLE开发--进 ...

  8. NENU进制转换课后练习题解(问题A~问题F)

    ​ 文章目录 前言:对整数进制转换的理解 1.1进制理解 1.2如何转换? 问题 A: 5201 二进制位 题目描述 参考代码 问题 B: 5202 二进制转化为十六进制 题目描述 参考代码 问题 C ...

  9. Python之计算机要点,进制转换,数据间转换(2020.04.01)

    计算机的基本概念 1.1 计算机是什么? 电脑,手机,计算器-他是一种机器 计算机的特点: 1.拥有存储记忆功能 2.数值计算 3.逻辑计算 计算机其实就是一个能够按照程序运行.自动.高速处理数据的现 ...

  10. 19章 位运算与进制转换

    1.进制转换 1.1整数进制转换 例:10进制转16进制 (114514)10=(BF52)16 方法:除16取余法 1.2整数进制转换例题 方法1: #include <stdio.h> ...

最新文章

  1. 详解PreparedStatement
  2. [LeetCode]202. Happy Number(平衡二叉树 哈希表)
  3. PO BO VO DTO POJO DAO概念及其作用(附转换图)
  4. 本地连接虚拟机数据库或远程数据库
  5. c#和python同一主机直接udp_为什么Python 如此之慢
  6. freebsd nginx php mysql_FreeBSD 安装配置Nginx+PHP+APC+MySQL
  7. 【lua学习】4.表
  8. Java ObjectOutputStream writeFloat()方法与示例
  9. java 快速排序 递归_Java递归快速入门
  10. mysql sql option_MySQL 报错MySQL server syntax to use near 'OPTION SQL_SELECT_LIMIT=DEFAULT'
  11. 苹果的“价格战”还能走多远? | 畅言
  12. python软件下载中文版-PyCharm中文版
  13. 在wamp集成环境中添加mysql操作记录
  14. 转载 LDAP Schema Design
  15. IDEA中对Git的常规操作
  16. 女生学UI合适吗?橙色优学告诉你女生UI设计优势
  17. cv2批量修改图片大小
  18. 百度地图JS版本API常见问题
  19. MFC CString 长度取得
  20. linux的c文件报错for,linux c 编译错误 conflicting types for 的解决办法

热门文章

  1. 335x内核ddr3频率与电压修改
  2. 在cmd指令看计算机位数,如何判断电脑是32位还是64位
  3. 怎么把外部参照合并到图纸_CAD外部参照如何绑定?
  4. OpenGL--------第一个窗口
  5. 高通平台msm8953 display子系统学习
  6. c语言flag,[求助]int flag的意思
  7. 【转】关于测试方面的一些文章
  8. 使用函数求余弦函数的近似值
  9. word压缩软件,免费
  10. 轻松盘,资产盘点不再难 RFID办公资产盘点管理