首页 > 试题广场 >

进制转换

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

写出一个程序,接受一个十六进制的数值字符串,输出该数值的十进制字符串(注意可能存在的一个测试用例里的多组数据)。


输入描述:

输入一个十六进制的数值字符串。



输出描述:

输出该数值的十进制字符串。

示例1

输入

0xA

输出

10
#include <iostream>
using namespace std;

int main(){
    
    int n;
    while(cin>>hex>>n){
        cout<<dec<<n<<endl;
    }
    
    return 0;
}

dec-十进制(默认)

oct-八进制

hex-十六进制

bin-二进制

强制转换一下
发表于 2019-02-16 15:20:17 回复(1)
题目没挖坑,数值貌似不是太大,很厚道
#include <stdio.h>
#include <string.h>
#define N 200

int main()
{
    int x, n;
    char str[N];
    while(gets(str))
    {
        n=0;
        int len=strlen(str);
        for(int i=2; i<len; i++)
        {
            if('0'<=str[i]&&str[i]<='9') x=str[i]-'0';
            else if('a'<=str[i]&&str[i]<='z') x=str[i]-'a'+10;
            else x=str[i]-'A'+10;
            n=n*16+x;
        }
        printf("%d\n", n);
    }
    return 0;
}

发表于 2018-02-22 18:53:56 回复(0)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
using namespace std;

const int maxM = 36;    // 最大进制数 '0'-'9' + 'a'-'z' 共 36 种
const int maxn = 10000;

int M = 16;      // 原始进制
int N = 10;      // 目标进制

string str;     // 存储输入

// 所有数组 0 号元素均表示数组长度
int dr[maxn];       // 存储由字符串转过来的大数
int drans[maxn];    // 求余过程中的商
int drres[maxn];    // 余数

map<char, int> mci; // 字符与数字对应的map
map<int, char> mic; // 数字与字符对应的map

// 字符与数值对应map初始化
void initialization()
{
    // 字符与数字对应的map构建
    for(int i = 0; i < maxM; ++i)
    {
        if(i < 10)
        {
            // '0' - '9'
            mci['0'+i] = i;
            mic[i] = '0'+i;
        }
        else
        {
            // 'a' - 'z'
            mci['a'+i-10] = i;
            mic[i] = 'a'+i-10;
        }
    }
}

// 判断是否是大写字母
int isCapital(char ch)
{
    if(ch >= 'A' && ch <= 'Z')
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

// 字符串预处理,并给存储原始进制的数组赋值
void pretreatment()
{
    // 将所有大写字母转换成小写
    for(int i = 0; i < str.length(); ++i)
    {
        // 大写字母转小写
        if(isCapital(str[i]) == 1)
        {
            str[i] = 'a' + str[i] - 'A';
        }
    }
    // 给存储原始进制的数组赋值
    memset(dr, 0, sizeof(dr));
    // i 从 2 开始排除前面的 0x
    for(int i = 2; i < str.length(); ++i)
    {
        dr[++dr[0]] = mci[str[i]];
    }
}

// 将 M 进制的 dr 转换成 N 进制
void solve()
{
    memset(drres, 0, sizeof(drres));

    int i, j, y;

    // 模 n 取余法,(总体规律是先余为低位,后余为高位)
    while(dr[0] >= 1)
    {
        // 只要被除数仍然 >= 1,则继续操作
        y = 0;
        i = 1;
        drans[0] = dr[0];       // 商的长度与被除数相同(包含前导0)
        while(i <= dr[0])
        {
            y = y * M + dr[i];
            drans[i++] = y / N;
            y %= N;
        }
        drres[++drres[0]] = y;  // 本轮计算得到的余数
        i = 1;
        // 找到下一轮商的起始位置
        while((i<=drans[0]) && (drans[i] == 0)) ++i;
        // 清除这一轮使用的被除数
        memset(dr, 0, sizeof(dr));
        // 本轮得到的商为下一轮的被除数
        for(j = i; j <= drans[0]; ++j)
        {
            dr[++dr[0]] = drans[j];
        }
        // 清除本轮的商
        memset(drans, 0, sizeof(drans));
    }
}

// 输出 N 进制的结果
void output()
{
    for(int i = drres[0]; i >= 1; --i)
    {
        cout << mic[drres[i]];
    }
}

int main()
{
    
    initialization();   // 字符与数值对应的map的构建
    while(cin >> str)
    {
        pretreatment();     // 预处理字符串,并给存储原始进制的数组赋值
        solve();            // 将 M 进制的 dr 转换成 N 进制
        output();           // 输出 N 进制的结果
        cout << endl;
    }

    return 0;
}


发表于 2016-08-09 18:15:47 回复(0)
#include <stdio.h>
#include <string.h>

int main()
{
    int len,i,j,p;
    int r,t;
    char s[100],b[100000];
    int d[100];
    while(scanf("%s",&s)!=EOF)
    {
        len=strlen(s);
        for(i=2;i<len;i++)
        {
            if(s[i]>='A'&&s[i]<='F')
                d[i]=10+s[i]-'A';
            else if(s[i]>='a'&&s[i]<='f')
                d[i]=10+s[i]-'a';
            else
                d[i]=s[i]-'0';
        }        
        for(i=2,p=0;i<len;)
        {
            for(j=i,r=0;j<len;j++)
            {
                t=r*16+d[j];
                d[j]=t/10;
                r=t%10;                
            }
            b[p++]=r+'0';
            while(d[i]==0) i++;
        }
        for(i=p-1;i>=0;i--) printf("%c",b[i]);
        printf("\n");
    }
}

发表于 2021-02-11 21:39:49 回复(1)
#include<stdio.h>
(737)#include<string.h>
#include<math.h>
int main()
{
    char a[10],b[17]="0123456789ABCDEF";//利用下标代表ABCDEF
    int sum,i,j,num;
    while(scanf("%s",a)!=EOF)
    {
        num=0;sum=0;
        for(i=strlen(a)-1;i>=2;i--)
            for(j=0;j<=15;j++)
               if(a[i]==b[j])
               {
                 sum+=j*pow(16,num);
                 num++;
               } 
        printf("%d\n",sum);
    }
}

发表于 2020-04-03 21:21:47 回复(1)
Java
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) System.out.println(Integer.parseInt(scanner.next().substring(2),16));
    }
}


发表于 2020-03-18 17:45:53 回复(0)
/*
大数,m进制转10进制
10000进制版本
*/
#include <bits/stdc++.h>
using namespace std ;
const int AX = 1e6 + 666 ;
char s[AX] ;
int a[AX] ;
int b[AX] ;
int res[AX] ;
int k , kb ;
int m , n ;
void add() {
	int len = max( k , kb );
	int c = 0 ;
	for( int i = 1 ; i <= len ; i++ ) {
		b[i] = b[i] + a[i] + c ;
		c = b[i] / 10000 ;
		b[i] %= 10000 ;
	}
	if( c ) b[++len] += c ;
	kb = len ;
}
void mul( int num , int x ) {
	for( int i = 1 ; i <= num ; i++ ) {
		int c = 0 ;
		for( int j = 1 ; j <= k ; j++ ) {
			a[j] = a[j] * x + c ;
			c = a[j] / 10000 ;
			a[j] %= 10000 ;
		}
		if( c ) a[++k] = c ;
	}
}
void m_to_ten( int len ) {
	int base = 0 ;
	kb = 1 ;
	memset( b , 0 ,sizeof(b) );
	for( int i = len - 1 ; i >= 0 ; i-- ) {
		k = 1 ;
		a[1] = 1 ;
		int x ;
		mul(base,m) ;
		if( s[i] >= '0' && s[i] <= '9' ) x = (int)(s[i]-'0');
		else {
			if( s[i] >= 'a' && s[i] <= 'z' ) s[i] = s[i] - 'a' + 'A' ;
			x = ( 10 + (int)(s[i]-'A') ) ;
		}
		mul(1,x);
		add();
		base ++ ;
	}
}
int main() {
	m = 16 ;
	char tmp[1000] ;
	while( ~scanf("%s",tmp) ) {
		strcpy( s , tmp + 2 );
		int len = strlen(s);
		m_to_ten(len);
		int f = 0 ;
		for( int i = kb ; i >= 1; i-- ) {
			if( i == k && !b[i] ) continue ;
			if( f ) printf("%04d",b[i]);
			else {
				printf("%d",b[i]);
				f = 1 ;
			}
		}
		printf("\n");
	}
	return 0 ;
}

编辑于 2020-03-09 13:32:00 回复(0)
#include <bits/stdc++.h>
using namespace std;
int main(){
    int d;
    while(~scanf("%x",&d)){ // 利用scanf的特性很快- -
         cout<<d<<endl;
    }
    return 0;
}

发表于 2020-03-03 02:24:13 回复(0)
#include <iostream>
using namespace std;

int main(){
	long long n;
	while(cin>>hex>>n){
		cout<<dec<<n<<endl;
	}
	return 0;
}

发表于 2020-02-28 20:31:11 回复(0)
#include <stdio.h>
#include <string.h>

int main ()
{
    unsigned char a[50];
    while(scanf("%s",a)!=EOF)
    {
        char ans[50];
        int len=strlen(a),c=0,p=0;
        for(int i=2;i<len;)
        {
            c=0;
            for(int j=i;j<len;j++)
            {
                if(a[j]>='A'&& a[j]<='F')a[j]=a[j]-'A'+10+c*16;
                else a[j]=a[j]-'0'+c*16;
                c=a[j]%10;
                if((a[j]/10)>=10)a[j]=(a[j]/10)-10+'A';
                else a[j]=(a[j]/10)+'0';
            }
            ans[p++]=c+'0';
            while(a[i]=='0')i++;
        }
        for(int i=p-1;i>=0;i--)printf("%c",ans[i]);
        printf("\n");
    }
}
非常标准的进制转换了,注意一定要用unsigned char!!!在计算过程中用char保存整数的话会超过127,就溢出了!!当初找了好几个小时的原因。
发表于 2020-02-10 22:17:00 回复(0)
我就想问一句这个难度指数小编能不能认真评分
发表于 2018-02-25 18:18:02 回复(2)
import string
import sys
change = {'A':10,'B':11,'C':12,'D':13,'E':14,'F':15}

while True:
    str1 = sys.stdin.readline().strip('\n')[::-1]
    if len(str1) == 0:
        break
    sum = 0
    t = 1
    for i in range(len(str1)):
        if str1[i]=='x'or str1[i]=='X':
            break
        elif str1[i] >= '0' and str1[i] <='9':
            sum = sum + int(str1[i])*t
            t = t*16
            continue
        elif (str1[i] >= 'A' and str1[i] <= 'F') or (str1[i] >= 'a' and str1[i] <= 'f'):
            sum = sum + change.get(str1[i])*t
            t = t*16
            continue
    print(sum)
发表于 2017-09-23 17:49:48 回复(0)
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int m=0;
while(sc.hasNext()){
String str = sc.nextLine();
String stra  = str.substring(2);
System.out.println(Integer.parseInt(stra,16));
}
}
}
发表于 2016-09-02 19:31:01 回复(0)
#include <stdio.h>

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

编辑于 2017-03-13 20:43:43 回复(20)
#include <iostream>
#include <string.h>
using namespace std;
int main(){
    char num[101];
    while(gets(num)){        
        long ans=0,bit=1;
        for(int i=strlen(num)-1;i>=2;i--){
            if(num[i]>='A'&&num[i]<='F'){
                ans+=(num[i]-'A'+10)*bit;
            }else ans+=(num[i]-'0')*bit;
            bit*=16;
        }        
        cout<<ans<<endl;
    }
    return 0;
}

发表于 2017-12-09 15:42:45 回复(3)
while True:
    try:
        print(int(input(),16))
    except:
        break
发表于 2017-09-12 15:31:58 回复(0)
#include <iostream>
#include<cstdio>
#include<cstring>

using namespace std;

char a[100];

int charToint(char a){
    int result=0;
    if(a=='0') result=0;
    else if(a=='1') result=1;
    else if(a=='2') result=2;
    else if(a=='3') result=3;
    else if(a=='4') result=4;
    else if(a=='5') result=5;
    else if(a=='6') result=6;
    else if(a=='7') result=7;
    else if(a=='8') result=8;
    else if(a=='9') result=9;
    else if(a=='A') result=10;
    else if(a=='B') result=11;
    else if(a=='C') result=12;
    else if(a=='D') result=13;
    else if(a=='E') result=14;
    else if(a=='F') result=15;
    return result;
}

int main()
{
    while(~scanf("%s",&a)){
    char *p=a+2;
    int l=strlen(p);
    int sum=0,mlt=1;
    for(int i=l-1;i>=0;i--){
        sum+=charToint(p[i])*mlt;
        mlt*=16;
    }
    cout<<sum<<endl;

}
return 0;
}

编辑于 2017-04-23 14:06:04 回复(3)
#include <iostream>
#include <string>
using namespace std;

int main(){
    string str;
    while(cin >> str){  //可能存在一个测试用例里有多组数据
        int res = 0, remain = 0;
        for(int i = 2; i < str.size(); ++i){ //从2开始,跳过0x
            if(str[i]>='0' && str[i]<='9'){
                remain = str[i] - '0';
            }else{ //A~F
                remain = str[i] - 'A' + 10;
            }
            res = res*16 + remain;
        }
        cout << res << endl;
    }
    return 0;
}

编辑于 2024-03-07 10:31:24 回复(0)
import sys
try: while True:
        number = sys.stdin.readline().strip()
        count = 0  number = number[2:]
        number = number[::-1]
        a = 0  for i in number: if i <= '9' and i >= '0':
                count +=  (ord(i) - ord('0')) * (16 ** a) elif i <= 'F' and i >= 'A':
                count += 16 ** a * (ord(i) - ord('A') + 10) elif i <= 'f' and i >= 'a':
                count += 16 ** a * (ord(i) - ord('a') + 10)
            a += 1  print str(count) except: pass

发表于 2016-09-04 21:28:27 回复(0)
list1 = ["A", "B", "C", "D", "E", "F"]

while True:
    try:
        tdata = input()
        rdata = tdata[2:]
        num = 0
        for i in range(len(rdata)):
            if "A" <= rdata[i] <= "F":
                num += 16 ** (len(rdata) - i - 1) * (list1.index(rdata[i]) + 10)
            elif "0" <= rdata[i] <= "9":
                num += 16 ** (len(rdata) - i - 1) * (int(rdata[i]))
        print(num)
    except EOFError:
        break

编辑于 2024-03-14 20:49:19 回复(0)

问题信息

难度:
106条回答 13455浏览

热门推荐

通过挑战的用户

查看代码