首页 > 试题广场 > 进制转换
[编程题]进制转换
  • 热度指数:494613 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。


输入描述:

输入一个十六进制的数值字符串。注意:一个用例会同时有多组输入数据,请参考帖子https://www.nowcoder.com/discuss/276处理多组输入的问题。



输出描述:

输出该数值的十进制字符串。不同组的测试用例用\n隔开。

示例1

输入

0xA
0xAA

输出

10
170

#include <iostream>
using namespace std;

int main()
{
    int a;
    while(cin>>hex>>a){
    cout<<a<<endl;
    }
}
发表于 2016-03-24 12:36:23 回复(107)

python3解法,一行代码搞定:

while True:
    try:
        print(int(input(),16))
    except:
        break
编辑于 2017-09-08 08:35:34 回复(28)
直接调用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));
        }
    }
}

编辑于 2017-07-27 16:37:25 回复(8)
只是将字符串转换成十进制的数,程序就能通过,看来题目的目的只是将十六进制转换成十进制
#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
	char str[100];
	int i=0,count,sum;
	while(gets(str))//用于多次输入
	{
		count=strlen(str);//计算字符串的长度
		sum=0;
	    for(i=count-1;i>=0;i--)//从十六进制个位开始,每位都转换成十进制
	    {
		if(str[i]>='0'&&str[i]<='9')//数字字符的转换
		{
			sum+=(str[i]-48)*pow(16,count-i-1);
		}
		else if(str[i]>='A'&&str[i]<='F')//字母字符的转换
		{
			sum+=(str[i]-55)*pow(16,count-i-1);
		}
	    }
	    printf("%d\n",sum);
	}
	return 0;
 } 

发表于 2016-07-03 09:52:24 回复(17)
尽管我采用long做出来了。然后看了下大家的答案,差不多。
其实,我想说的是,并不是我们想的这么简单,
因为我们都忽略了超大数据,不论int,long,long long都会越界,所以
题意中,才要我们输出十进制数的字符串表达。
需要我们实现十进制整数字符串的加法,这才是重点和难点!!!
编辑于 2016-05-09 21:43:51 回复(23)
这道题用Java自带的函数转换也,当然自己写也行,代码如下:
自带函数转换: import java.util.*;
/**
 * Created by 华夏紫云 on 2015/11/23.
 */
public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        while (sc.hasNext()){
            String str=sc.next().substring(2);
            System.out.println(Integer.parseInt(str,16));
        }
    }
自己实现转换:
import java.util.*;
/**
 * Created by 华夏紫云 on 2015/11/23.
 */
public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        while (sc.hasNext()){
            StringBuffer sb=new StringBuffer();
            sb.append(sc.next());
            //String str=sc.next();
            String str=sb.reverse().substring(0,sb.length()-2);
            char ch[]=str.toCharArray();
            int sum=0;
            for(int i=0;i<ch.length;i++){
                if(ch[i]>='A'&&ch[i]<='F'){
                    sum+=(Integer.valueOf(ch[i])-55)*Math.pow(16,i);
                }else {
                    sum+=(Integer.valueOf(ch[i])-48)*Math.pow(16,i);
                }
            }
            System.out.println(sum);
           // System.out.println(Integer.valueOf('6'));
        }
    }
 
}

编辑于 2015-12-16 12:46:22 回复(30)
/*方法一:作为字符串一个字符一个字符的读*/
#include<isotream>
#include <string.h>
using namespace std;
int main()
{
    char *sp=new char[10];
    while(cin>>sp)
    {
        int n;
		int num;int result=0;
        n=strlen(sp);
		for(int i=2;i<n;i++)
		{
			switch (sp[i])
			{
				case 'A':
            		num=10;break;
				case 'B':
            		num=11;break;
				case 'C':
            		num=12;break;
				case 'D':
            		num=13;break;
				case 'E':
            		num=14;break;
				case 'F':
            		num=15;break;
				default:
            		if(sp[i]>='0'&&sp[i]<='9')
						num=sp[i]-'0';
            		else
						return 0;
			}
			result=result*16+num;
		}
        cout<<result<<endl;
        memset(sp,0,sizeof(sp));
		result=0;
    }
    return 0; 
}
/*方法二:流类格式化输入输出*/  #include<isotream>
#include <iomanip>
using namespace std;
int main()
{   
    int a;
    while(cin>>hex>>a)
    cout<<dec<<a<<endl;
    return 0;
}

编辑于 2016-07-06 15:35:00 回复(5)
//C语言版本:
#include <stdio.h>
int main(){
    int a;
    while (scanf("%x", &a) != EOF){
        printf("%d\n", a);
    }
    return 0;
}

//C++版本:
#include <iostream>
int main(){
    int a;
    while ((cin >> hex >> a)){
        cout << a << endl;}    
    }
   return 0;
}

发表于 2017-06-27 09:55:00 回复(14)
import sys

while True:
    try:
        string_hex = sys.stdin.readline()
        print int(string_hex, 16)
    except:
        break
人生苦短,好好科研!

发表于 2016-05-31 20:35:40 回复(11)
自带的Integer.parseInt(s, radix)可以转化,其中s为输入字符串,radix为进制数,返回值为int型十进制整数。

除了用这个函数之外还可以自己写一个处理函数

import java.util.Scanner;

public class Main {

/**
* @param args
*/

public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
while (scanner.hasNextLine()) {
String input = scanner.nextLine();
fun(input);
}
}

public static void fun(String input) {
String subString = input.substring(2, input.length());
int result = 0;
for (int i = 0; i < subString.length(); i++) {
if (subString.charAt(i) >= 'A' && subString.charAt(i) <= 'F') {
result += result * 15 + subString.charAt(i) - 'A' + 10;
} else if (subString.charAt(i) >= 'a' && subString.charAt(i) <= 'f') {
result += result * 15 + subString.charAt(i) - 'a' + 10;
} else {
result += result * 15 + subString.charAt(i) - '0';
}
}
System.out.println(result);
}
}
发表于 2016-03-14 20:53:33 回复(2)
不知道是你们想的太简单,还是我想的太复杂,我觉得这个题重点在于字符串,如果十六进制的数值的字符串有一百位怎么办?long long 都不够用了吧?
发表于 2016-08-05 23:20:08 回复(7)
其实不懂,这些题是要自己实现,还是用一些库或者技巧就可以了,主要是考察什么啊?
我自己实现了一个,欢迎大家给意见
#include<iostream>
#include<string>
using namespace std;
int main(){
    string s;
    while(cin>>s){
        int length = s.size();
        if(length  <= 2)
            continue;
        if(s[0]!='0' || s[1]!='x')
            continue;
       
        int res =0;
        int flag =1;
        for(int i=length-1;i>1;--i){
            char cur = s[i];
            if(cur>='A'&&cur<='F'){
                res+=(cur-'A'+10)*flag;
            }
            else if(cur>='0' && cur<='9'){
                res+=(cur-'0')*flag;
            }
            else
                continue;
            flag*=16;
        }     
        cout<<res<<endl;     
    } 
    return 0;
}

编辑于 2016-07-20 14:42:23 回复(3)
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Scanner;

public class Main {
    
public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    while(input.hasNext()) {
        String s = input.nextLine();
        String trans = s.substring(2);
        char a[] = trans.toCharArray();
        int leng = trans.length();
        BigDecimal result = new BigDecimal(0);
        BigDecimal b16 = new BigDecimal(16);
        for(char p:a) {
            leng--;
            if(p >= 'A') {
                BigDecimal temp = new BigDecimal(p).subtract(new BigDecimal(55));
                BigDecimal t = temp.multiply(b16.pow(leng));
                result = result.add(t);
            }else {
                BigDecimal temp = new BigDecimal(p).subtract(new BigDecimal(48));
                BigDecimal t = temp.multiply(b16.pow(leng));
                result = result.add(t);    
            }
        }
        System.out.println(result);
        }
    }
}
我看见前面都没有大整数的考虑,我是用大整数实现的。
发表于 2018-05-23 21:42:08 回复(1)
import java.util.Scanner;
public class Main{
    public static void main(String[]args){
        Scanner in = new Scanner(System.in);
        while(in.hasNextLine()){
            String str = in.nextLine();
            System.out.println(Integer.parseInt(str.substring(2),16));//str.substring(2)表示去除0x
        }
    }
}

发表于 2016-07-12 21:37:44 回复(7)
//用string做存储 进行大数加和乘法,不会int溢出 输入任意长度16进制字符均可以
#include<iostream> #include <string> #include <algorithm> using namespace std; void addI(string& str, int a){ if (str.length() == 0) { while (a > 0){ str += '0' + a % 10; a /= 10; } reverse(str.begin(), str.end()); return ; } reverse(str.begin(), str.end()); int sum = str[0] - '0' + a; str[0] = '0' + sum % 10; int carry = sum / 10; for (int i = 1; i<str.length(); i++){ sum = str[i]-'0' + carry; str[i] = sum % 10 + '0'; carry = sum / 10; } if (carry>0) str += (char)(carry + '0'); reverse(str.begin(), str.end()); } void multi16(string& str){ if (str.length() == 0)return; reverse(str.begin(), str.end()); int carry = 0; int mul = 0; for (int i = 0; i<str.length(); i++){ mul = 16*(str[i] - '0') + carry; str[i] = mul % 10 + '0'; carry = mul / 10; } if (carry>0){ while (carry > 0){ str += carry % 10 + '0'; carry /= 10; } } reverse(str.begin(), str.end()); } int main(){ string str; string res; int tmp; while (cin >> str){ res.clear(); for (int i = 2; i < str.length(); i++){ multi16(res); if (isupper(str[i]))tmp = 10 + str[i] - 'A'; else if (islower(str[i])) tmp = 10 + str[i] - 'a'; else tmp = str[i] - '0'; addI(res, tmp); } cout << res << endl; } return 0; }

编辑于 2016-08-10 19:34:22 回复(3)
Python:利用s[:1:-1]把前两个十六进制的标志去掉,并且得到一个反向的字符串用于一一遍历,在这里报错,“你的输出为:
空。请检查一下你的代码,有没有循环输入处理多个case。”。但是为什么我在自己的编辑器上没有出现问题呢
s=input()
dic_map={'A':10,'B':11,'C':12,'D':13,'E':14,'F':15}
count=0
k=0
for i in s[:1:-1]:
    if i.isdigit()==True:
        count+=int(i)*(16**k)
        k+=1
    else:
        count+=dic_map[i]*(16**k)
        k+=1
print(count)

发表于 2017-11-27 22:45:37 回复(2)
import java.util.*;
public class Main{
    public static void main(String[] args){
		Scanner in = new Scanner(System.in);
		while(in.hasNext()){
			String string = in.next().substring(2);
			System.out.println(Integer.parseInt(string,16));
		}
	}
}

发表于 2017-06-28 10:10:17 回复(0)
import java.util.Scanner;

public class Main{
    
    public static void main(String[] args){
        
        
        Scanner sc=new Scanner(System.in);
        
        while(sc.hasNext()){
            
            String s=sc.next();
            
            String[] ss=s.split("x");
            
            char[] c=ss[1].toCharArray();
            
            int[] num=new int[c.length]; 
            
            
            for(int i=0;i<c.length;i++){
                
                
                
                
                switch(c[i]){
                    
                case '0': num[i]=0;break;
                case '1': num[i]=1;break;
                    case '2': num[i]=2;break;
                    case '3': num[i]=3;break;
                    case '4': num[i]=4;break;
                    case '5': num[i]=5;break;
                    case '6': num[i]=6;break;
                    case '7': num[i]=7;break;
                    case '8': num[i]=8;break;
                    case '9': num[i]=9;break;
                    case 'A': num[i]=10;break;
                    case 'B': num[i]=11;break;
                    case 'C': num[i]=12;break;
                    case 'D': num[i]=13;break;
                    case 'E': num[i]=14;break;
                    case 'F': num[i]=15;break;
             
                    
                    
            }
            
            
                
            }
            
           
            
            
            int result=0;
                
                for(int k=0;k<c.length;k++){
                    
                    result+=Math.pow(16,c.length-k-1)*num[k];
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    
                }
                
                
                System.out.println(result);
                
                
                
                
                
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
        }
        
        
        
        
        
        
        
        
        
        
        
        
        
    }

}
发表于 2017-06-21 20:25:50 回复(0)
#include <iostream>
#include <string>

using namespace std;

int main()
{
string hex_str;
string oct_str;
int oct_num = 0;
while(cin >> hex_str)
{
for(int i = 2;i < hex_str.length();i++)
{
if(hex_str[i] >= 'A' && hex_str[i] <= 'F')
oct_num = oct_num*16 + ( hex_str[i] - 'A' + 10 );
else if(hex_str[i] >= 'a' && hex_str[i] <= 'f')
oct_num = oct_num*16 + ( hex_str[i] - 'a' + 10 );
else
oct_num = oct_num*16 + ( hex_str[i] - '0' );
}
cout << oct_num<<endl;
oct_num = 0;
}
return 0;
}

编辑于 2016-07-14 10:40:39 回复(2)
/*
不太明白这道题想考什么?只是16进制转换而已。
要求输出十进制字符串,但以int形式输出也通过了。
*/
#include <iostream>
#include <cstring>
#include <cmath> 
using namespace std;
intf(charc,inti)
{
    intn;
    switch(c){
        case'F': n=15; break;
        case'E': n=14; break;
        case'D': n=13; break;
        case'C': n=12; break;
        case'B': n=11; break;
        case'A': n=10; break;
        default: n=c-'0';
    }
    returnn*pow(16,i);
}
intmain()
{
    chars[10];
    while(cin>>s){
        intnumber = 0;
        for(inti=2;i<strlen(s);++i){
            number += f(s[i],strlen(s)-i-1);
        }
        cout << number << endl;
    }
    return0;
}

编辑于 2016-03-01 22:28:39 回复(4)

问题信息

难度:
1064条回答 125844浏览

热门推荐

通过挑战的用户

查看代码