
正文
华为笔试——C++进制转换
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
题目:2-62进制转换
题目介绍:输入一个n1 进制的整数(包括负数),将其转换成n2 进制,其中n1 、n2 的范围是 [ 2,62 ] 。每个数字的范围是0-9、a-z、A-Z。不用考虑非法输入。
输入:
n1 n2
n1 进制整数
输出:
n2 进制整数
例:
输入:
8 16
-1352460
输出:
-5d530
分析:
这道题目需要考虑几点:负整数的输入;将输入的n1 进制的数转换成10 进制的数,再用长除法将这个10 进制的数转换成 n2 进制的数;a-z和A-Z与其代表的整数的相互转换(char 类型的ASC||码与整数的变换)。
代码如下:
#include <iostream>
#include <string>
#include <math.h>
#include <conio.h>
using namespace std;
int main()
{
string str;
int size;
int i = ;
int result = ;
int n = ;
int r[];//长除法
char q[];
int n1, n2;
cout << "n1.n2" << endl;
cin >> n1 >> n2;
cout << "str" << endl;
cin >> str;
size = str.size();
char *p = new char[size];
strcpy(p, str.c_str());
if (p[] == '-') { p[] = ''; }//考虑到负数
for (i = ; i < size; i++)
{
if (p[i] >= 'a'&&p[i] <= 'z')
{
p[i] = p[i] - ;
}
if (p[i] >= 'A'&&p[i] <= 'Z')
{
p[i] = p[i] + ;
}
}//将a-z的字符意义化a=10、···
for (i = ; i < size; i++)
{
result += int(p[i] - ) * int(pow(n1, size - - i));
}
cout << result << endl;//计算十进制值
while ((result / n2) >= n2)
{
r[n] = result % n2;
result = result / n2;
n++;
}
r[n] = result % n2;
n++;
r[n] = result / n2;//取余取除值
for (i = ; i < (n + ); i++)
{
if (r[i] >= &&r[i]<=) { q[i] = r[i]+; }//a-z的输出转换
else if (r[i] >=&&r[i]<=) { q[i] = r[i]+; }//A-Z的输出转换
else { q[i] = char(r[i] + ); }//0-9转换
}
if (p[] == '') { cout << "-"; }//负数还原
for (i = ; i < (n + ); i++)
{
cout << q[n - i];
}
}
结果如图:其中输出的第二行为10 进制的该数。







