问题描述
从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。
样例输入
FFFF
样例输出
65535
方法1:直接输入输出即可,不过数据大小必须在长整型范围内;虽然这样也能AC,但是这并不是我们的目标
#include <stdio.h>
int main( )
{
long long n;
scanf("%x",&n);//以16进制方式输入
printf("%lld",n);//以10进制方式输出
return 0;
}
方法2:任意进制转换成十进制,系数 * 基数^权重 之和。长整型范围内
#include <iostream>
#include <stdio.h>
#include <string.h>
const int N=16;
int XtoD(char *s);//十六进制转十进制函数
int main( )
{
char str[N];
scanf("%s",str);
XtoD(str);
return 0;
}
int XtoD(char *s)
{
int i,j;
int len=strlen(s);
long long k=0,d=1;
for(i=len-1;i>=0;i--)//提取单个十六进制位数
{
if(s[i]>='A')
k+=(s[i]-'A'+10)*d;//k是系数
else
k+=(s[i]-'0')*d;
d*=16;//基数^权重
}
printf("%lld",k);
return 0;
}
方法3:定义一个数组存储数据,这样可以处理更大的位数;任意进制转换成十进制,系数 * 基数^权重 之和
#include <iostream>
#include <stdio.h>
const int N=16;
int XtoD(char *s);//十六进制转十进制函数
int solve(int *n,int m);//
int main( )
{
char str[N];
scanf("%s",str);
XtoD(str);
return 0;
}
int XtoD(char *s)
{
int i,j,k;
int num_10[N]={0};//初始化
for(i=0;s[i]!='\0';i++)//提取单个十六进制位数
{
if(s[i]>='A')
k=s[i]-'A'+10;
else
k=s[i]-'0';
solve(num_10,k);
}
for(i=0;num_10[i]==0&&i<N-1;i++);//前导0不用输出,但是只有0时还是要输出一个0
for(;i<N;i++)
printf("%d",num_10[i]);//打印十进制
return 0;
}
int solve(int *n,int m)
{
int A[N]={0},B[N]={0};//初始化
for(int i=N-1;i>0;i--)//实现n*16;
{
A[i]=n[i]*6;//个位 ,*6
B[i-1]=n[i];//左移一位,*10
}
n[N-1]=m;//初始化,加m
for(int i=N-1;i>0;i--)//实现n*16;
{
n[i]+=A[i]+B[i];//乘法竖式
if(n[i]>10)//有进位
{
n[i-1]=n[i]/10;
n[i]=n[i]%10;
}
else//无进位
n[i-1]=0;
}
return 0;
}