【九度OJ】题目1118:数制转换 解题报告
标签(空格分隔): 九度OJ
原题地址: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)。
样例输入:
15 Aab3 7
样例输出:
210306
Ways
每次都会因为一些细节出错,本题中,注意判断法按时都是以带有等号的,最后输出时别忘了加上0的ASCii,最后,注意数组是char,应该以%c形式输出。
进制之间的转换,首先转换成10进制,再转换成任意进制。转换成10进制的时候,注意,对于A-Z的表示的数字的转换,使用ASCII码的形式转换。
另外在转换过程中,一定要注意数字的正序和倒序等等问题,防止出错。
另外发现java的版本很方便啊,以后数制转换就用Java了哈哈哈。
#include <stdio.h>
#include <string.h>
int main() {
int a, b;
char n[20];
while (scanf("%d%s%d", &a, n, &b) != EOF) {
//任意进制转10进制
int len = strlen(n);
int trans = 0;
for (int i = 0; i < len; i++) {
int x = 0;
if (n[i] >= '0' && n[i] <= '9') {//都有等于号
x = n[i] - '0';
} else if (n[i] >= 'a' && n[i] <= 'z') {
x = 10 + n[i] - 'a';
} else if (n[i] >= 'A' && n[i] <= 'Z') {
x = 10 + n[i] - 'A';
}
trans = a * trans + x;
}
//下面10进制转成任意进制
int temp = trans;
char ans[20];
int size = 0;
do {
int end = temp % b;
ans[size++] = (end >= 10) ? (end - 10 + 'A') : (end + '0');
//加上0的ASCII
temp /= b;
} while (temp > 0);
for (int i = size - 1; i >= 0; i--) {
printf("%c", ans[i]);//以字符形式输出,不是整数
}
printf("\n");
}
return 0;
}
写了个通用的change函数,利用BigInteger类可以轻松的实现数制转换。,就是BigeIteger.toString(to)方法。
这个题目中因为要求最终结果是大写字母,所以使用了toUpperCase(),否则默认的是小写字母。
import java.util.*;
import java.math.*;
public class Main{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
String line = scanner.nextLine();
String[] params = line.split(" ");
System.out.println(change(params[1],
Integer.parseInt(params[0]),
Integer.parseInt(params[2])));
}
}
//num 要转换的数 from源数的进制 to要转换成的进制
private static String change(String num, int from, int to) {
return new BigInteger(num, from).toString(to).toUpperCase();
}
}
Date
2017 年 3 月 6 日