[算法练习] 正整数数制转换

题目说明:

把一个十进制的正整数转换成N进制的数,或者把一个N进制的数转换成十进制的数(2 <= N,M <=16)。

还可以继续扩展到负数和小数进制转换算法。

程序代码:

#include <gtest/gtest.h>
using namespace std;

string DecimalConvertToRadix(int nValue, int nRadix)
{
    int State[256] = {0};
    int nIndex = 0;
    static char szText[] = "0123456789ABCDEF";

    while (nValue)
    {
        State[nIndex++] = nValue % nRadix;
        nValue = nValue / nRadix;
    };

    string strValue;
    for (int i = nIndex-1; i >= 0; --i)
    {
        strValue += szText[State[i]];
    }

    if (strValue.empty())
    {
        strValue = "0";
    }

    return strValue;
}

int RadixConvertToDecimal(const string& strValue, int nRadix)
{
    int nValue = 0;
    int Base = 1;    

    for (int i = strValue.size()-1; i >=0; i--)
    {
        char cTemp = strValue[i];
        if (cTemp >= ‘a‘ && cTemp <= ‘f‘)
        {
            nValue += (cTemp - ‘a‘ + 10) * Base;
        }
        else if (cTemp >= ‘A‘ && cTemp <= ‘F‘)
        {
            nValue += (cTemp - ‘A‘ + 10) * Base;
        }
        else
        {
            nValue+= (cTemp - ‘0‘) * Base;
        }

        Base *= nRadix;
    }

    return nValue;
}

TEST(Pratices, tNumberConversion)
{
    // 10进制转2进制
    // 0 =>
    // 1 => 1
    // 2 => 10
    // 34 => 100010
    // 100 => 1100100
    ASSERT_EQ(DecimalConvertToRadix(0, 2), "0");
    ASSERT_EQ(DecimalConvertToRadix(1, 2), "1");
    ASSERT_EQ(DecimalConvertToRadix(2, 2), "10");
    ASSERT_EQ(DecimalConvertToRadix(34, 2), "100010");
    ASSERT_EQ(DecimalConvertToRadix(100, 2), "1100100");

    // 10进制转8进制
    // 0 =>
    // 7 => 7
    // 8 => 10
    // 9 => 11
    // 34 => 42
    // 100 => 144
    ASSERT_EQ(DecimalConvertToRadix(0, 8),"0");
    ASSERT_EQ(DecimalConvertToRadix(7, 8),"7");
    ASSERT_EQ(DecimalConvertToRadix(8, 8),"10");
    ASSERT_EQ(DecimalConvertToRadix(9, 8),"11");
    ASSERT_EQ(DecimalConvertToRadix(34, 8),"42");
    ASSERT_EQ(DecimalConvertToRadix(100, 8),"144");

    // 2进制转10进制
    // 0 = > 0
    // 1 = > 1
    // 10 = > 2
    // 1101 = >13
    // 11111111 => 255
    ASSERT_EQ(RadixConvertToDecimal("0", 2),0);
    ASSERT_EQ(RadixConvertToDecimal("1", 2),1);
    ASSERT_EQ(RadixConvertToDecimal("10", 2),2);
    ASSERT_EQ(RadixConvertToDecimal("1101", 2),13);
    ASSERT_EQ(RadixConvertToDecimal("11111111", 2),255);

    // 16进制转换10进制
    // 0 => 0
    // f => 15
    // 10 => 16
    // 1Fea => 8170
    // FFFF => 65535
    ASSERT_EQ(RadixConvertToDecimal("0", 16),0);
    ASSERT_EQ(RadixConvertToDecimal("f", 16),15);
    ASSERT_EQ(RadixConvertToDecimal("10", 16),16);
    ASSERT_EQ(RadixConvertToDecimal("1Fea", 16),8170);
    ASSERT_EQ(RadixConvertToDecimal("FFFF", 16),65535);
}

  看书、学习、写代码
时间: 2024-10-13 22:19:00

[算法练习] 正整数数制转换的相关文章

7、蛤蟆的数据结构笔记之七栈的应用之数制转换

7.蛤蟆的数据结构笔记之七栈的应用之数制转换 本篇名言:"人生意义的大小,不在乎外界的变迁,而在乎内心的经验." 上面两篇中我们实现了链栈和链队列,接下去哦我们看看实际中栈的应用场景.本次来看下栈在数制转换的作用. 欢迎转载,转载请标明出处: 1.  原理介绍 十进制N和其他进制数的转换时计算机实现计算的基本问题.简单算法如下: N=(N div d )x d + N modd 2.  实现 2.1         定义结构体 定义堆栈的结构体 typedef struct { int

数据结构实践——数制转换(栈)

本文是针对数据结构基础系列网络课程(3):栈和队列的实现项目. [项目 - 数制转换] 把十进制的整数转换为任一进制数输出.请利用栈设计算法,并实现程序. 提示:要转换为r进制,则原来的数逐次除以基数r(除完之后用商再除),直到商为0,得到的一系列余数的逆序就是转换结果.这里的"逆序",意味着后产生的余数,会先输出,后进先出,栈的机会来了-- [参考解答] 解法:头文件sqstack.h请见[顺序栈算法库],使用链栈也可以. #include <stdio.h> #incl

数据结构--栈的基本操作及应用(数制转换)

#include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <math.h> #define TRUE 1 #define FALSE 0 #define ERROR 0 #define INFEASIBLE -1 typedef int Status; typedef int Boolean; typedef int SElemType; #define STACK_INIT_SI

数制转换

进制的转换可以借助强大的BigInteger,非常的方便. new java.math.BigInteger(num, from).toString(to); 表示num要转换的数从from源数的进制 转换成to的进制. 题目描述 求任意两个不同进制非负整数的转换(2进制-16进制),所给整数在long所能表达的范围之内.     不同进制的表示符号为(0,1,...,9,a,b,...,f)或者(0,1,...,9,A,B,...,F). 输入描述:     输入只有一行,包含三个整数a,n,

1115: 零起点学算法22——华氏摄氏温度转换

1115: 零起点学算法22--华氏摄氏温度转换 Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 3522  Accepted: 1456[Submit][Status][Web Board] Description 输入一个华氏温度,根据公式C=(5/9)(F-32)计算对应的摄氏温度. Input 输入一个华氏温度值(多组数据) Output 输出输入的华氏温度和转换后的摄氏温度值. 输入格式请

01:数制转换

01:数制转换 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 求任意两个不同进制非负整数的转换(2进制-16进制),所给整数在long所能表达的范围之内.不同进制的表示符号为(0,1,...,9,a,b,...,f)或者(0,1,...,9,A,B,...,F). 输入 输入只有一行,包含三个整数a,n,b.a表示其后的n 是a进制整数,b表示欲将a进制整数n转换成b进制整数.a,b是十进制整数,2 =< a,b <= 16. 输出 输出包含一行,该

1158: 零起点学算法65——进制转换

1158: 零起点学算法65--进制转换 Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 1068  Accepted: 615[Submit][Status][Web Board] Description 输入一个十进制数N,将它转换成R进制数输出. Input 输入数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R(2<=R<=16, R<>10). Output

处理数据类型转换,数制转换、编码转换相关的类

MXS&Vincene  ─╄OvЁ  &0000014 ─╄OvЁ  MXS&Vincene MXS&Vincene  ─╄OvЁ:今天很残酷,明天更残酷,后天很美好,但是绝大部分人是死在明天晚上,只有那些真正的英雄才能见到后天的太阳. MXS&Vincene  ─╄OvЁ:We're here to put a dent in the universe. Otherwise why else even be here? 正文>>>>>

java使用链栈实现数制转换

java实现链栈在前面有所介绍:http://www.cnblogs.com/lixiaolun/p/4644141.html 将前面java实现链栈的代码稍作修改: package linkedstack; public class LinkStack { private Element base; private Element top; class Element { public Object data; public Element next; } /** * 初始化栈 * */ pu