题目描述
写出一个程序,接受一个十六进制的数值字符串,输出该数值的十进制字符串。(多组同时输入 )
输入描述:
输入一个十六进制的数值字符串。
输出描述:
输出该数值的十进制字符串。
C++ code:
#include <iostream>
#include <string.h>
#include <math.h>
#include <stdio.h>
using namespace std;
#define MAX 200
int tr(char c)
{
if (c>=48 && c<=57)
{
return (int)(c - 48); //0-9
}else if (c>=65 && c<=70)
{
return (int)(c - 55); //A-Z
}else if (c>=97 && c<=102)
{
return (int)(c - 87); //a-z
}
return -1;
}
int main()
{
char str[20];
long ten = 0;
cin.getline(str, MAX);
//scanf_s("%s",&str);
int sum = strlen(str);
for (int i = sum - 1; i>1;i--)
{
ten += tr(str[i]) * pow(16, sum -i -1);
}
//int a = tr('b');
cout<< ten <<endl;
return 0;
}
idea:
1、不知道为啥这个为啥一直通不过。但是在vs2013是可以有测试结果的。
2、tr函数的作用:实现将读取的字符转换为数字,ASCII转换为int。
3、用定义,从十六进制的最后一位开始计算,pow(16,2)代表16的平方。
i>1是因为,前两位0x是不用参与计算的。
Java Code:
import java.util.Scanner;
public class Main5 {
static int tr(char c)
{
if (c>=48 && c<=57)
{
return (int)(c - 48);
}else if (c>=65 && c<=70)
{
return (int)(c - 55);
}else if (c>=97 && c<=102)
{
return (int)(c - 87);
}
return -1;
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
while(scan.hasNext()){
String str = new String(scan.nextLine());
char str1[] = str.toCharArray();
long ten = 0;
//cin.getline(str, MAX);
//scanf_s("%s",&str);
int sum = str1.length;
for (int i = sum - 1; i>1;i--)
{
ten += tr(str1[i]) * ( Math.pow(16, sum -i -1));
}
//int a = tr('b');
System.out.println(ten);
}
}
}
idea:
1、上面C++的翻译版本。
2、(1)String类的toCharArray()方法,将字符串转换为字符数组
(2)String类的valueOf()方法,将char类型的数组转换为字符串