1942: 数制转换
时间限制: 1 Sec 内存限制: 32 MB
献花: 165 解决: 63
[献花][花圈][TK题库]
题目描述
求任意两个不同进制非负整数的转换(2进制~16进制),所给整数在long所能表达的范围之内。
不同进制的表示符号为(0,1,…,9,a,b,…,f)或者(0,1,…,9,A,B,…,F)。
输入
输入只有一行,包含三个整数a,n,b。a表示其后的n 是a进制整数,b表示欲将a进制整数n转换成b进制整数。a,b是十进制整数,2 =< a,b <= 16。
输出
可能有多组测试数据,对于每组数据,输出包含一行,该行有一个整数为转换后的b进制数。输出时字母符号全部用大写表示,即(0,1,…,9,A,B,…,F)。
样例输入
4 123 10
样例输出
27
提示
用字符串存储和表示不同进制的数。
#include <iostream>
#include <fstream>
#include <stack>
#include <string>
using namespace std;
const char A[] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' };
string change(long long num, int Into)
{
stack<char> s;
string result;
int index = 0;
if (0 == num)
result = "0";
while (num)
{
s.push(num % Into);
num /= Into;
}
for (; !s.empty(); ++index)
{
result += A[s.top()];
s.pop();
}
return result;
}
long long atoDeci(string n, int OF)
{
long long result = 0;
int tmp,size = n.size();
for (int i = 0; i < size; ++i)
{
if ('0' <= n[i] && n[i] <= '9')
tmp = n[i] - '0';
else if (65 <= n[i] && n[i] <= 90)
tmp = n[i] - 55;//-65 + 10;
else tmp = n[i] - 87;//-97+10;
result = result * OF + tmp;
}
return result;
}
int main()
{
#ifdef _DEBUG
ifstream cin("data.txt");
#endif // _DEBUG
string n;
long long a, b, Deci;
while (cin >> a >> n >> b)
{
Deci = atoDeci(n, a);
cout << change(Deci, b) << endl;
}
#ifdef _DEBUG
cin.close();
system("pause");
#endif // _DEBUG
return 0;
}
/**************************************************************
Problem: 1942
User: Sharwen
Language: C++
Result: 升仙
Time:1 ms
Memory:1712 kb
****************************************************************/