问题描述
从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。
样例输入
FFFF
样例输出
65535
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin>>s;
int n,p=0;
int L=s.length();
for(int i=L-1;i>=0;i--)
{
switch(s[i])
{
case '0':n=0;break;
case '1':n=1;break;
case '2':n=2;break;
case '3':n=3;break;
case '4':n=4;break;
case '5':n=5;break;
case '6':n=6;break;
case '7':n=7;break;
case '8':n=8;break;
case '9':n=9;break;
case 'A':n=10;break;
case 'B':n=11;break;
case 'C':n=12;break;
case 'D':n=13;break;
case 'E':n=14;break;
case 'F':n=15;break;
default:break;
}
p=p+pow(16,i)*n;
}
cout<<p<<endl;
return 0;
}
只有25分😒。。。。。。
应该是由于使用了错误的幂运算导致的。
在代码的循环中,计算十六进制转换为十进制的值时,使用了 pow(16,i) 这个函数来求解幂。然而,pow 函数返回的结果是一个浮点数,可能会导致精度误差。
在这种情况下,建议使用整数类型来计算幂。可以通过定义一个变量 base 并初始化为 1,然后在每次迭代中将 base 乘以 16 来实现。
以下是修改后的代码:
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin>>s;
int n,p=0,base=1;
int L=s.length();
for(int i=L-1;i>=0;i--)
{
switch(s[i])
{
case '0':n=0;break;
case '1':n=1;break;
case '2':n=2;break;
case '3':n=3;break;
case '4':n=4;break;
case '5':n=5;break;
case '6':n=6;break;
case '7':n=7;break;
case '8':n=8;break;
case '9':n=9;break;
case 'A':n=10;break;
case 'B':n=11;break;
case 'C':n=12;break;
case 'D':n=13;break;
case 'E':n=14;break;
case 'F':n=15;break;
default:break;
}
p=p+base*n;
base=16*base;
}
cout<<p<<endl;
return 0;
}
呃。。差25分,只有75分,
解决了🙌🙌,把p和base改为long long型。
有符号整数(int)的范围是从 -2147483648 到 2147483647,无法存储超过该范围的数值。当输入的十六进制数比较大时,转换后的十进制数可能会超出有符号整数(int)的范围,导致输出结果错误。为了避免这种溢出问题,可以将存储结果的数据类型改为无符号整数(unsigned int),其范围更适合存储转换后的十进制数。这样可以确保结果正确地表示十六进制数转换后的十进制数。
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin>>s;
int n=0;
long long p=0,base=1;
int L=s.length();
for(int i=L-1;i>=0;i--)
{
switch(s[i])
{
case '0':n=0;break;
case '1':n=1;break;
case '2':n=2;break;
case '3':n=3;break;
case '4':n=4;break;
case '5':n=5;break;
case '6':n=6;break;
case '7':n=7;break;
case '8':n=8;break;
case '9':n=9;break;
case 'A':n=10;break;
case 'B':n=11;break;
case 'C':n=12;break;
case 'D':n=13;break;
case 'E':n=14;break;
case 'F':n=15;break;
default:break;
}
p=p+base*n;
base=16*base;
}
cout<<p<<endl;
return 0;
}