求解!!! 一道蓝桥杯的题 结果对的 提交老是出错,

海外散修-厉飞雨 2018-01-03 08:46:09
问题描述
  从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
  注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。
样例输入
FFFF
样例输出
65535


#include <iostream>
#include <string>
#include <math.h>

using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main() {
string number;
unsigned long int number_10 = 0;
cin >> number;
int n = number.length();
for(int i = number.length(); i > 0; i--)
{
// cout << number[i - 1] << endl;
switch(number[i - 1])
{
case '0':number_10 += 0 * pow(16,(i - 1));break;
case '1':number_10 += 1 * pow(16,(i - 1));break;
case '2':number_10 += 2 * pow(16,(i - 1));break;
case '3':number_10 += 3 * pow(16,(i - 1));break;
case '4':number_10 += 4 * pow(16,(i - 1));break;
case '5':number_10 += 5 * pow(16,(i - 1));break;
case '6':number_10 += 6 * pow(16,(i - 1));break;
case '7':number_10 += 7 * pow(16,(i - 1));break;
case '8':number_10 += 8 * pow(16,(i - 1));break;
case '9':number_10 += 9 * pow(16,(i - 1));break;
case 'A':number_10 += 10 * pow(16,(i - 1));break;
case 'B':number_10 += 11 * pow(16,(i - 1));break;
case 'C':number_10 += 12 * pow(16,(i - 1));break;
case 'D':number_10 += 13 * pow(16,(i - 1));break;
case 'E':number_10 += 14 * pow(16,(i - 1));break;
case 'F':number_10 += 15 * pow(16,(i - 1));break;
default :break;
}
//cout << number_10 << '\n';
}
cout << number_10 << '\n';
return 0;
}
一开始以为是数据类型的问题,改了还是有问题,不知道怎么弄。。。。
...全文
929 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
真相重于对错 2018-01-03
  • 打赏
  • 举报
回复
// hextooct.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> #include <string> #include <math.h> using namespace std; /* run this program using the console pauser or add your own getch, system("pause") or input loop */ int main() { string number; unsigned long int number_10 = 0; cin >> number; int n = number.length(); for(int i = 0;i<n; i++) { // cout << number[i - 1] << endl; int tmp = n-i-1; switch(number[i]) { case '0':number_10 += 0 * pow(16.,tmp);break; case '1':number_10 += 1 * pow(16.,tmp);break; case '2':number_10 += 2 * pow(16.,tmp);break; case '3':number_10 += 3 * pow(16.,tmp);break; case '4':number_10 += 4 * pow(16.,tmp);break; case '5':number_10 += 5 * pow(16.,tmp);break; case '6':number_10 += 6 * pow(16.,tmp);break; case '7':number_10 += 7 * pow(16.,tmp);break; case '8':number_10 += 8 * pow(16.,tmp);break; case '9':number_10 += 9 * pow(16.,tmp);break; case 'A':number_10 += 10 * pow(16.,tmp);break; case 'B':number_10 += 11 * pow(16.,tmp);break; case 'C':number_10 += 12 * pow(16.,tmp);break; case 'D':number_10 += 13 * pow(16.,tmp);break; case 'E':number_10 += 14 * pow(16.,tmp);break; case 'F':number_10 += 15 * pow(16.,tmp);break; default :break; } } cout << number_10 << '\n'; system("pause"); return 0; }
wodexiaojidan 2018-01-03
  • 打赏
  • 举报
回复
最好是从最低位开始转换,每转换一次乘以10再加上高一位
引用 楼主 coolsand_zhou 的回复:
问题描述   从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。   注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。 样例输入 FFFF 样例输出 65535 #include <iostream> #include <string> #include <math.h> using namespace std; /* run this program using the console pauser or add your own getch, system("pause") or input loop */ int main() { string number; unsigned long int number_10 = 0; cin >> number; int n = number.length(); for(int i = number.length(); i > 0; i--) { // cout << number[i - 1] << endl; switch(number[i - 1]) { case '0':number_10 += 0 * pow(16,(i - 1));break; case '1':number_10 += 1 * pow(16,(i - 1));break; case '2':number_10 += 2 * pow(16,(i - 1));break; case '3':number_10 += 3 * pow(16,(i - 1));break; case '4':number_10 += 4 * pow(16,(i - 1));break; case '5':number_10 += 5 * pow(16,(i - 1));break; case '6':number_10 += 6 * pow(16,(i - 1));break; case '7':number_10 += 7 * pow(16,(i - 1));break; case '8':number_10 += 8 * pow(16,(i - 1));break; case '9':number_10 += 9 * pow(16,(i - 1));break; case 'A':number_10 += 10 * pow(16,(i - 1));break; case 'B':number_10 += 11 * pow(16,(i - 1));break; case 'C':number_10 += 12 * pow(16,(i - 1));break; case 'D':number_10 += 13 * pow(16,(i - 1));break; case 'E':number_10 += 14 * pow(16,(i - 1));break; case 'F':number_10 += 15 * pow(16,(i - 1));break; default :break; } //cout << number_10 << '\n'; } cout << number_10 << '\n'; return 0; } 一开始以为是数据类型的问题,改了还是有问题,不知道怎么弄。。。。
真相重于对错 2018-01-03
  • 打赏
  • 举报
回复
逻辑错误高低位取反了!
paschen 版主 2018-01-03
  • 打赏
  • 举报
回复
编译没问题,你试下自己写函数实现pow,你用的pow按double方式运算的,可能因精度误差导致转换的整数舍入后有出入,另外检查下边界情况下是否满足

64,671

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧