首页 > 试题广场 >

进制转换

[编程题]进制转换
  • 热度指数:959827 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
\hspace{15pt}对于给定的十六进制数,输出其对应的十进制表示。
\hspace{15pt}在本题中,十六进制数的格式为:\texttt{0x} 开头,后跟若干个十六进制数字( \texttt{0-9}\texttt{A-F} )。其中,\texttt{A-F} 依次代表 10-15

输入描述:
\hspace{15pt}在一行上输入一个十六进制数 s ,代表待转换的十六进制数。
\hspace{15pt}保证 s 转化得到的十进制数 x 的范围为 1 \leqq x \leqq 2^{31}-1


输出描述:
\hspace{15pt}在一行上输出一个整数,代表 s 对应的十进制数。
示例1

输入

0xFA93

输出

64147

说明

\hspace{15pt}回忆十六进制转化为十进制的方法:从右往左,将第 i 位乘以 {\color{orange}{16^i}} ,然后求和。

\hspace{15pt}在这个样例中,\texttt{0xFA93} 的第 0 位是 \texttt{3} ,第 1 位是 \texttt{9} ,第 2 位是 \texttt{A} ,第 3 位是 \texttt{F} ,因此 \texttt{0xFA93} = 3 \times {\color{orange}{16^0}} + 9 \times {\color{orange}{16^1}} + 10 \times {\color{orange}{16^2}} + 15 \times {\color{orange}{16^3}} = 64147

#include <iostream>
using namespace std;

int main()
{
    int a;
    while(cin>>hex>>a){
    cout<<a<<endl;
    }
}
发表于 2016-03-24 12:36:23 回复(120)
#include<iostream>
using namespace std;
//十进制 dec
//十六进制:hex
//八进制:oct
int main()
{
    int a;
    while(cin>>hex>>a)   //读入六进制
    {
        cout<<a;
        cout<<endl;
    }
    return 0;
}

发表于 2021-08-18 15:36:28 回复(1)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

ll XToDec(string s,ll x) {  //将给定的x进制字符串s转换成10进制
    ll ans = 0;
    for(ll i = 0; i < s.length(); i++) {
        ans = ans*x + (isdigit(s[i]) ? s[i]-'0' : s[i]-'A'+10);
    }
    return ans;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    string s;
    while(cin >> s) {
        s = s.substr(2,s.length()-2);
        cout << XToDec(s,16) << endl;
    }
    return 0;
}
编辑于 2020-08-26 09:01:38 回复(0)
如果p进制数x为a1a2...an,则十进制为y=a1*p的n-1次幂+a2*p的n-2次幂+an
#include<iostream>
(720)#include<string.h>
#include<math.h> 
using namespace std;
int main(){
	char s[1000];
	while(gets(s)){
		int m=0,sum=0;
		int len=strlen(s);
		for(int i=len-1;i>=0;i--){
			if(s[i]>='0'&&s[i]<='9')
			sum=sum+(s[i]-'0')*pow(16,m);
			else if(s[i]>='A'&&s[i]<='F')
			sum=sum+(s[i]-'A'+10)*pow(16,m);
			else if(s[i]>='a'&& s[i]<='f')
			sum=sum+(s[i]-'a'+10)*pow(16,m);
			m++;
	  	}
	  	cout<<sum<<endl;
	}
} 



发表于 2020-03-30 10:30:12 回复(0)
#include <iostream>
#include <string>
using namespace std;

unsigned long HextoDec(string s)
{
    unsigned long sum = 0, *result = new unsigned long[s.length()];
    for (int i = 0; i < s.length(); i++)
    {
        if (s[i] >= 'A' && s[i] <= 'F') result[i] = ((unsigned long)(s[i]) - 55) << (4 * (s.length() - 1 - i)); //m乘以的2的n次方 = m << n
        else if (s[i] >= 'a' && s[i] <= 'f') result[i] = ((unsigned long)(s[i]) - 87) << (4 * (s.length() - 1 - i));
        else if (s[i] >= '0' && s[i] <= '9') result[i] = (unsigned long)(s[i] - 48) << (4 * (s.length() - 1 - i));
        sum += result[i];
    }
    return sum;
}

int main()
{
    string s;
    while (cin >> s)
    {
        string hex;
        for(int i = 2; i < s.length(); i++) hex += s[i];
        cout << HextoDec(hex) << endl;
    }
    return 0;
}
发表于 2018-05-10 17:12:14 回复(0)
NJ头像 NJ
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
 
intmain()
{
    string str1;
    while(cin >> str1)
    {
        string str2=str1.substr(2,str1.size()-2);
        intsum=0;
        for(inti = str2.size()-1;i>=0;--i)
        {
            if(str2[i] >= '0'&& str2[i] <= '9')
                str2[i] -= 48;
            if(str2[i] >= 'A'&& str2[i] <= 'F')
                str2[i] -=55;
            sum += str2[i]*pow(16,str2.size()-i-1);
        }
        cout << sum << endl;
    }
        return0;
}

发表于 2017-08-30 15:23:36 回复(2)
whileTrue:
    try:
        print str(int(raw_input(),base=16))
    except EOFError:
        break
发表于 2017-03-13 22:16:25 回复(0)

python3解法,一行代码搞定:

while True:
    try:
        print(int(input(),16))
    except:
        break
编辑于 2017-09-08 08:35:34 回复(29)
#include<iostream>
using namespace std;
int func(int);
int main()
{
    
    string str;
    cin>>str;
    long long hx=0;
    for(int i=str.size()-1;i>1;i--)
    {
        if(str[i]=='A'||str[i]=='a')
            str[i]=10;
        else if(str[i]=='B'||str[i]=='b')
                str[i]=11;
        else if(str[i]=='C'||str[i]=='c')
                str[i]=12;
        else if(str[i]=='D'||str[i]=='d')
                str[i]=13;
        else if(str[i]=='E'||str[i]=='e')
                str[i]=14;
        else if(str[i]=='F'||str[i]=='f')
                str[i]=15;
        else if(str[i]=='9')
            str[i]=9;
        else if(str[i]=='8')
            str[i]=8;
        else if(str[i]=='7')
            str[i]=7;
        else if(str[i]=='6')
            str[i]=6;
        else if(str[i]=='5')
            str[i]=5;
        else if(str[i]=='4')
            str[i]=4;
        else if(str[i]=='3')
            str[i]=3;
        else if(str[i]=='2')
            str[i]=2;
        else if(str[i]=='1')
            str[i]=1;
        else
            str[i]=0;
        hx+=str[i]*func(str.size()-i-1);
    }
    cout<<hx;
    return 0;
}
int func(int i)
{
    int temp=1;
    if(i==0)
        return 1;
   else
   {
    for(int j=1;j<=i;j++)
      temp*=16;  
    return temp;
   }
}
发表于 2022-04-19 18:42:59 回复(0)

十六进制转换十进制与二进制转换十进制同理,不同之处在于二进制的位权是2的指数,而十六进制的位权则是16的指数。针对本题输入的十六进制数值字符串除却开头的"0x",剩余位为有效位。对有效位从右至左依次升幂,同时乘以当位的基数,对每一位执行相同的如上操作,再将结果求和即可得十六进制数值对应的十进制数值。

import java.util.HashMap;
import java.util.Scanner;

public class Main {

    private static HashMap<Character, Integer> map;

    static {
        map = new HashMap<Character, Integer>();
        map.put('A', 10);
        map.put('B', 11);
        map.put('C', 12);
        map.put('D', 13);
        map.put('E', 14);
        map.put('F', 15);
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        while (in.hasNext()) {
            String input = in.nextLine();

            System.out.println(toDecimal(input));
        }
    }

    private static int toDecimal(String input) {
        //将十六进制数值字符串转换为十进制数值

        int res = 0;
        int length = input.length() - 1;
        for (int i = input.length() - 1; i >= 2; i--) {
            //当前位字符
            char cur = input.charAt(i);
            if (Character.isDigit(cur)) {
                //如果当前位字符为数字,直接将字符转为相应的int型数值,执行运算
                res += Math.pow(16, length - i) * Integer.parseInt(cur + "");
            } else {
                //如果当前位字符为A~F中的字母,根据十六进制规定,将其转换为相应的int型数值,执行运算
                res += Math.pow(16, length - i) * map.get(cur);
            }
        }

        return res;
    }
}
发表于 2022-01-23 20:11:01 回复(1)
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
int main()
{
    string str;
    while(cin>>str){
        long long int ans=0;
        int tmp=0;
        for(int i=str.length()-1;i>=2;i--){
            if(str[i]>='0'&&str[i]<='9'){
                ans+=(str[i]-'0')*pow(16,tmp++);
            }
            else{
                ans+=(str[i]-'A'+10)*pow(16,tmp++);
            }
        }
        cout<<ans<<endl;
    }
}
发表于 2019-07-23 14:49:21 回复(0)
#include<iostream> 
using namespace std;
int main() {
    int a;
    while (cin >> hex >> a) {
        cout << a << endl;
    }
}

发表于 2016-08-11 16:48:40 回复(0)


#include <bits/stdc++.h>
using namespace std;

int main(){
    int x;
    while(scanf("%x", &x) == 1){
        printf("%d\n", x);
    }
    return 0;
}

#include <bits/stdc++.h>
using namespace std;

void pt(int x){
    if(x > 9) pt(x / 10);
    putchar('0' + x % 10);
}

int main(){
    int x;
    while(scanf("%x", &x) == 1){
        pt(x);
        puts("");
    }
    return 0;
}

发表于 2016-05-11 12:52:22 回复(1)
测试数据醉的不行。。。。明明结果是一样硬是不通过。。。能不能把程序的运行结果也显示出来再说对不对啊?
发表于 2015-12-17 18:53:17 回复(5)
尽管我采用long做出来了。然后看了下大家的答案,差不多。
其实,我想说的是,并不是我们想的这么简单,
因为我们都忽略了超大数据,不论int,long,long long都会越界,所以
题意中,才要我们输出十进制数的字符串表达。
需要我们实现十进制整数字符串的加法,这才是重点和难点!!!
编辑于 2016-05-09 21:43:51 回复(24)
只是将字符串转换成十进制的数,程序就能通过,看来题目的目的只是将十六进制转换成十进制
#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 回复(19)
这道题用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)
直接调用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 回复(11)
//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 回复(17)
/*方法一:作为字符串一个字符一个字符的读*/
#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 回复(6)

问题信息

难度:
2086条回答 166132浏览

热门推荐

通过挑战的用户

查看代码
进制转换