zoukankan      html  css  js  c++  java
  • [算法练习] 正整数数制转换

    题目说明:

    把一个十进制的正整数转换成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);
    }

     

    Book16  看书、学习、写代码
  • 相关阅读:
    bat过滤任意字符
    汇编代码之修改文件时间
    使用C语言编写提取通用shellcode的程序
    汇编代码之修改文件时间
    VC++6.0中内存泄漏检测
    透视木马程序开发技术
    bat过滤任意字符
    VC++6.0中内存泄漏检测
    透视木马程序开发技术
    使用C语言编写提取通用shellcode的程序
  • 原文地址:https://www.cnblogs.com/Quincy/p/4849190.html
Copyright © 2011-2022 走看看