-
http://ac.jobdu.com/problem.php?pid=1118
-
求任意两个不同进制非负整数的转换(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)。
1、注意n==000000的情况
2、16进制输出大写字母
//题目1074:对称平方数
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<fstream>
#include<cstring>
#include<map>
#include<math.h>
using namespace std;
long turn10(char n[],int a) //将该数字转化成10进制数,a为原进制数
{
map<char, int>Map;
Map['A'] = 10; Map['a'] = 10; Map['B'] = 11; Map['b'] = 11; Map['C'] = 12; Map['c'] = 12;
Map['D'] = 13; Map['d'] = 13; Map['E'] = 14; Map['e'] = 14; Map['F'] = 15; Map['f'] = 15;
int len = strlen(n), temp, sum = 0;
for (int i = 0; i < len; i++)
{
if (n[i] >= '0' && n[i] <= '9') //0-9时
{
temp = n[i] - '0';
sum += pow(a, len - 1 - i) * temp;
}
else
{
temp = Map[n[i]];
sum += pow(a, len - 1 - i) * temp;
}
}
return sum;
}
void turnb(long num10, int b) //十进制数变成b进制数后打印出来
{
char result[100]; //取模后逆序存放
map<int, char> Map;
int i = 0, temp;
Map[10] = 'A'; Map[11] = 'B'; Map[12] = 'C'; Map[13] = 'D'; Map[14] = 'E'; Map[15] = 'F';
while (num10 != 0)
{
temp = num10 % b;
if (temp >= 10)
result[i++] = Map[temp];
else
result[i++] = temp + '0';
num10 = num10 / b;
}
for (; i > 0; i--)
cout << result[i-1];
cout << endl;
}
int main()
{
int a, b;//a表示其后的n是a进制整数,b表示欲将a进制整数n转换成b进制整数。a,b是十进制整数,2 =< a,b <= 16。
char n[100]; //用char来存储n
ifstream cin("data.txt");
while (cin >> a >> n >> b)
{
long num10 = turn10(n, a); //num10为原数得到的10进制数
if (num10 == 0)
cout << "0" << endl;
else
{
//char newnum[100];
//_itoa_s(num10, newnum, b); //将num10变成任意b进制数字,存放在newnum[]字符串中
//itoa()这个函数就是不让在OJ上用~~~,只能自己写了~~~
//cout << newnum << endl;
turnb(num10, b);
}
}
system("pause");
return 0;
}