2~62位任意进制转换方法(c++)

进制转换的符号表为[0-9a-zA-Z],共61个字符,最大可表示62进制。

思路是原进制先转换为10进制,再转换到目标进制。

疑问:

对于负数,有小伙伴说可以直接将符号丢弃,按照整数进行进位转换,最后再将负号补回来,我认为这种做法是不对的。

正确的做法是:考虑好按照16位(short)还是32位(int)抑或64位(long long),先求出二进制补码(这时候就正负数就统一了),将二进制数转换为十进制后在转换为其他进制(如果有小伙伴知道如何直接将二进制转换为任意进制的方法可以留言告诉我,不胜感激。注意这里的任意进制不是单纯的8 16等2的幂次进制,还有其他的比如7、9等)。

下面贴上这种我认为针对负数的处理方法不太合适的代码:

输入格式:原进制,目标进制,原进制下的数字(用字符串表示)

输出格式:目标进制下的数字

#include <iostream>
#include <string>
#include <cmath>
using namespace std;

//将任意字符转换为十进制,其中a-z代表10-35,A-Z代表36-61,用对应的ASCII码调整就好
long long convertToDec(char c)
{
 long long decNum;
 if(c>='a' && c<='z')
  decNum=c-87;
 else if(c>='A' && c<='Z')
  decNum=c-29;
 else if(c>='0' && c<='9')
  decNum=c-48;

 return decNum;
}

//将十进制转换为这些字符
char convertToDec(long long c)
{
 long long objchar;
 if(c>=10 && c<=35)
  objchar=c+87;
 else if(c>=36 && c<=61)
  objchar=c+29;
 else if(c>=0 && c<=9)
  objchar=c+48;

 return objchar;
}

int main()
{
 int src;
 int obj;
 string num;

 while(cin>>src>>obj>>num)
  {

   bool IsNegative=false;
   if(num[0]=='-')
    {
     num.erase(0);
     IsNegative=true;
    }

   long long decNum=0;//十进制数(中间数)
   for(long long i=0;i<num.size();++i)
    decNum+=convertToDec(num[i])*pow(src,num.size()-1-i);

   string strTmp;
   long long tmp;
   while(decNum>0)
    {
     tmp=decNum % obj;
     strTmp=convertToDec(tmp)+strTmp;
     decNum/=obj;
    }

   if(IsNegative)
    strTmp='-'+strTmp;
   cout<<strTmp<<endl;
  }

 return 0;
}

以上这篇2~62位任意进制转换方法(c++)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • C++ 基础编程之十进制转换为任意进制及操作符重载

    C++ 基础编程之十进制转换为任意进制及操作符重载 最近学习C++ 的基础知识,完成十进制转换为任意进制及操作符重载,在网上找的不错的资料,这里记录下, 实例代码: #include<iostream> #include<vector> #include<limits> using namespace std; using std::iterator; ///<summary> ///十进制转换为任意进制,为了熟悉操作符,也加了操作符重载. ///包括自增(

  • C++ 十进制转换为二进制的实例代码

    题目内容:将十进制整数转换成二进制数. 输入描述:输入数据中含有不多于50个的整数n(-231<n<231). 输出描述:对于每个n,以11位的宽度右对齐输入n值,然后输出"-->",再然后输出二进制数.每个整数n的输出,独立占一行. 题目分析:将某个数从十进制转为二进制的具体方法是,该数对2取余,结果要么为1要么为0,此为该数对应二进制的末位:然后该数除以二,得到的商再次对2取余,结果为对应二进制的倒数第二位--以此类推,知道除以2的结果为0. 参考代码: 复制代码

  • c++实现十进制转换成16进制示例

    c++实现十进制转换成16进制 复制代码 代码如下: //Decimal to hexadecimal number//programming by : Erfan Nasoori//Date of send : 2009/1/11 #include <iostream.h> void main(){ int x,y,i; int d,n=1; int * r; char h[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D

  • c++10进制转换为任意2-16进制数字的实例

    废话不多说,直接上代码 #include<stdio.h> #include<stdlib.h> #include<iostream> using namespace std; int main() { //十进制转换为若干进制>2,<16 = int num; int n;//2-16之间 int a; int i=0; cin>>num>>n; int s[100]; if(n>=2&&n<<16

  • C++学习小结之二进制转换

    一.目的:便于计算机表示,稳定性好,符合逻辑运算,真为1,假为0. 二.各进制表示方法: 2进制:0,1 8进制:0-7 16进制:0-9,A,B,C,D,E,F 二.转换方法: 1.各进制转换为10进制: 从我们最了解的10进制入手.每个数都是10n次方相加.从右到左依次为:a*100+b*101+c*102....其结果表示为cba;同理二进制,八进制,16进制只是把10替换为2,8,16. 2.10进制转换2,8,16进制.取余反序排列. 3.8进制转2进制.首先要明白2进制是"逢1进1&

  • C++面试题之进制转换的实例

    C++进制转换的实例 一个面试题,要求输入十进制数,输出十六进制,可以使用printf打印%d,%c,%s来输出,但不能使用 %x 打印. 写了两种算法,还算比较简洁,粘贴在此. // 第一种算法,从低位到高位扫描移位,需要一个数组辅助倒序,一次性输出结果 #include <stdio.h> #define MAX_HEX_NUM 16 #define OUT_DATA_LEN sizeof(int)*2 // 2个16进制数表示1个字节 static char Hex_Char_Table

  • 2~62位任意进制转换方法(c++)

    进制转换的符号表为[0-9a-zA-Z],共61个字符,最大可表示62进制. 思路是原进制先转换为10进制,再转换到目标进制. 疑问: 对于负数,有小伙伴说可以直接将符号丢弃,按照整数进行进位转换,最后再将负号补回来,我认为这种做法是不对的. 正确的做法是:考虑好按照16位(short)还是32位(int)抑或64位(long long),先求出二进制补码(这时候就正负数就统一了),将二进制数转换为十进制后在转换为其他进制(如果有小伙伴知道如何直接将二进制转换为任意进制的方法可以留言告诉我,不胜

  • Golang如何实现任意进制转换的方法示例

    前言 最近因为工作的需要,需要写个短链服务,用到了10->62进制,网上找了一个,可以转换最多76位进制的博客,现在分享出来,下面话不多说了,来一起看看详细的介绍吧. 压缩数据用,无损压缩 示例代码: package main import ( "fmt" "math" "strconv" "strings" ) var tenToAny map[int]string = map[int]string{0: "

  • Java实现任意进制转换

    本文实例为大家分享了Java实现任意进制转换的具体代码,供大家参考,具体内容如下 问题描述 编写程序实现任意进制间的相互转换 (一).进制转换思想 1.先把任意进制转化为十进制 2.再把十进制转化为任意进制 3.本算法结合了十以下进制利用公式转换以及十以上进制调用函数转换 (二).问题分析 1.输入当前数进制 输入当前进制 m ,且保证 m>1 public static void main (String[] args){ int l,m,n; String l16; Scanner sc =

  • C语言实现任意进制转换器

    本文实例为大家分享了C语言实现任意进制转换器的具体代码,供大家参考,具体内容如下 简单的C语言任意进制转换器 该进制转换器可进行任意进制转换,请看效果图: 代码 /** ******函数声明 ******进制函数,输入与输出 void main(); ******返回将n进制num转换成的十进制数 int NToD(char *num,int n); ******将十进制数d转换成m进制数mnum void DToM(int d,int m,char *mnum); */ #include<st

  • php实现将任意进制数转换成10进制的方法

    本文实例讲述了php实现将任意进制数转换成10进制的方法.分享给大家供大家参考.具体如下: php将任意进制的数转换成10进制,例如8进制转换成10进制,16进制转换成10进制 <?php # Show the steps involved in converting a number # from any base (like octal or hex) to base 10 # See below for examples, instructions and copyright functi

  • php实现的任意进制互转类分享

    之前不知道php自带有base_convert可以实现任意进制之间的转换,自己写了一个.... <?php /** * 进制转换类 * @author sgf@funcity * @version 2011-02-15 */ Class Hex{ private static $element = array( '0','1','2','3','4','5','6','7','8','9', 'A','B','C','D','E','F','G','H','I','J', 'K','L','M'

  • PHP实现的62进制转10进制,10进制转62进制函数示例

    本文实例讲述了PHP实现的62进制转10进制,10进制转62进制函数.分享给大家供大家参考,具体如下: 百度出来的无法使用,只好自己写,有bug的地方欢迎留言,感谢 function from62to10($str){ $dict = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; $len = strlen($str); $dec = 0; for($i = 0;$i<$len;$i++){ //找到对应字典的

  • C#实现将汉字转化为2位大写的16进制Unicode的方法

    本文实例讲述了C#实现将汉字转化为2位大写的16进制Unicode的方法.分享给大家供大家参考.具体实现方法如下: 说明: str.ToString("x") : 转为1位16进制小写 str.ToString("X") : 转为1位16进制大写 str.ToString("X2"):转为2位16进制大写 具体代码如下: 复制代码 代码如下: publicstaticstring StringToUnicode16(string text, st

  • Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)

    使用Python内置函数:bin().oct().int().hex()可实现进制转换. 先看Python官方文档中对这几个内置函数的描述: bin(x) Convert an integer number to a binary string. The result is a valid Python expression. If x is not a Python int object, it has to define an __index__() method that returns

随机推荐