[编程题] 进制转换(16进制转10进制)

[编程题] 进制转换

3/3 [编程题] 进制转换

时间限制:C/C++ 1秒,其他语言2秒

空间限制:C/C++ 32M,其他语言64M

写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。(多组同时输入 )

输入描述:
输入一个十六进制的数值字符串。
输出描述:
输出该数值的十进制字符串。
输入例子1:
0xA
输出例子1:
10

个人方法

16进制 --> 10进制 思路: 比如:0x209

  1. 去掉 “ox”就剩下 209 (三位数:个-9、十-0、百-2)
  2. 10进制数 = 2 × 16^2 + 0 × 16^1 + 9 × 16^0 = 521

python :

# !/usr/bin/env python2
# -*- coding:utf-8 -*-
'''
Created on 2020年03月04日
@author: oucbl
'''
# # 10进制转16进制
# def dec2hex(dnum):
#     hexNum = []  # 16进制字符串(逆序/栈)
# 
#     while dnum >= 0:
#         mod16 = dnum % 16
#         hexNum.append(str(HEX16[mod16]))
#         dnum /= 16
# 
#         if dnum == 0 :
#             break
# 
#     hexNum = '0x' + ''.join([c for c in hexNum[::-1]])
#     return  hexNum

# 16进制转10进制
def hex2dec(hnum):
    decnum = 0  # 10进制数

    hnum = hnum[2:]   # 去掉前2位标识符
    lenth = len(hnum)  # 16进制数的长度
    for i in range(lenth):
        bNum = lenth - i -1  # 位数
        weight = 16 ** bNum  # 权值
        bValue = HEX16.index(hnum[i]) # 位值

        decnum += weight * bValue
        
    return decnum


if __name__ == '__main__':
    HEX16 = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
             'A', 'B', 'C', 'D', 'E', 'F']  #  十六进制 与 十进制 对照表
    
    try:
        while True:
            N = raw_input()   # python2接收 非数字 字符
            if str(N) == '' : 
                break 
            print hex2dec(N)  # 16进制转10进制
    except:
        pass

c++:

/*************************************************
Author: oucbl
Date: 2020.03.05
**************************************************/
#include <iostream>
#include <cmath>
using namespace std;

int charIndex(char c) // 查找数组元素位置
{
	string HEX16 = "0123456789ABCDEF"; // 十六进制 与 十进制 对照表

	int idx = 0;  // 元素位置
	for(int j=0; j < 16; j++)
	{
		if(c == HEX16[j])
		{
			idx = j;
			break;
		}
	}
	return idx;
}

long hex2dec(string hex_str)  // 16进制转10进制
{
    long decnum = 0;  // 10进制数
    int len = hex_str.length(); // (16进制)字符数组长度

    for(int j=2; j < len; j++)  // 从第2个元素 开始 遍历
    {
        int bNum = len - j -1;  // 位数
        long weight = pow(16, bNum); // 权值
        int bValue = charIndex(hex_str[j]);  // 位值

        decnum += weight * bValue;
    }
    return decnum;
}
int main()
{
    string hex;
    // cin获取整行,空行结束循环
	while(getline(cin, hex))
	{
		if(hex.length() == 0)
			break;
		cout<<hex2dec(hex)<<endl;
	}
    return 0;
}

优秀解析

1. 内置转换(python)

while True:
    try:
        print(int(input(),16))
    except:
        break

2. 内置转换(c++)

#include <iostream>
using namespace std;
int main()
{
	    int a;
	    while ((cin >> hex >> a)){
	        cout << a << endl;
	    }
	   return 0;
}
/*
* C++输出16进制是cout << hex << a;
*        8进制是cout << oct << a;
*/

3. 内置转换(c)

#include <stdio.h>
int main() {
    int a;
    while(scanf("%x",&a) != EOF)
        printf("%d\n",a);
    return 0;
}

4. 内置转换(java)

/*
直接调用Java的decode方法.
该方法的作用是将 String 解码为 Integer。接受十进制、十六进制和八进制数字。

根据要解码的 String(mn)的形式转成不同进制的数字。 mn由三部分组成:符号、基数说明符和字符序列。 -0X123中-是符号位,0X是基数说明符(0表示八进制,0x,0X,#表示十六进制,什么都不写则表示十进制),123是数字字符序列。
*/
import java.util.Scanner;
public class Main {
    public static void main(String[] args) throws Exception{
       Scanner sc=new Scanner(System.in);
        while (sc.hasNext()){
            String str=sc.next();
            System.out.println(Integer.decode(str));
        }
    }
}
posted @ 2020-03-05 21:56  oucbl  阅读(3990)  评论(0编辑  收藏  举报