问题链接:POJ NOI0113-01 数制转换。
原题出处:Bailian2710 数制转换。
总时间限制:
1000ms
内存限制:
65536kB
描述
求任意两个不同进制非负整数的转换(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)。
样例输入
15 Aab3 7
样例输出
210306
来源
2005~2006医学部计算概论期末考试
问题分析
这是一个进制转换的问题。
据说阿拉伯数字是印度人发明的。今天,采用阿拉伯数字的记数法被人们普遍采用。而且人们使用的是10进制。
然而,与计算机有关的常用的进制有10进制、8进制和16进制。
程序说明
程序中,函数convert()用于将数s从a进制转换为b进制。
AC的C语言程序:
/* Bailian2710 数制转换 */
#include <stdio.h>
#include <ctype.h>
#define N 72
char s[N], ans[N];
void convert(int a, char s[], int b)
{
long val, dcount, digit;
int i, j;
val = 0;
for(i=0; s[i]; i++) {
if(isdigit(s[i]))
val = val * a + s[i] - '0';
else
val = val * a + toupper(s[i]) - 'A' + 10;
}
dcount = 0;
while(val) {
digit = val % b;
val /= b;
ans[dcount++] = ((digit >= 10) ? 'A' - 10 : '0') + digit;
}
if(dcount == 0) {
ans[dcount++] = '0';
ans[dcount] = '\0';
} else
ans[dcount] = '\0';
// reverse
for(i=0, j=dcount-1; i<j; i++, j--) {
char c = ans[i];
ans[i] = ans[j];
ans[j] = c;
}
}
int main(void)
{
int a, b;
scanf("%d%s%d", &a, s, &b);
convert(a, s, b);
printf("%s\n", ans);
return 0;
}
AC的C++语言程序:
#include <iostream>
#include <string>
#include <ctype.h>
using namespace std;
string convert(int a, string& s, int b)
{
long val, dcount, digit;
char result[72], c;
string ans;
val = 0;
for(int i=0; i<(int)s.size(); i++) {
if(isdigit(s[i]))
val = val * a + s[i] - '0';
else
val = val * a + toupper(s[i]) - 'A' + 10;
}
dcount = 0;
while(val) {
digit = val % b;
val /= b;
result[dcount++] = ((digit >= 10) ? 'A' - 10 : '0') + digit;
}
if(dcount == 0) {
result[dcount++] = '0';
result[dcount] = '\0';
} else
result[dcount] = '\0';
// reverse
for(int i=0, j=dcount-1; i<j; i++, j--) {
c = result[i];
result[i] = result[j];
result[j] = c;
}
ans = result;
return ans;
}
int main()
{
int a, b;
string s;
cin >> a >> s >> b;
cout << convert(a, s, b) << endl;
return 0;
}