题目1118:数制转换(2008年北京大学图形实验室计算机研究生机试真题)
2014-05-20 18:59
399 查看
题目1118:数制转换
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:2438
解决:925
题目描述:
求任意两个不同进制非负整数的转换(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)。
样例输入:
样例输出:
提示:
可以用字符串表示不同进制的整数。
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main{
/**
* @param args
*/
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while( scanner.hasNext() ){
int a = scanner.nextInt();
String n = scanner.next();
int b = scanner.nextInt();
long result = changeToTenSystem(n, a);
List<Long> list = changeToMSystem(result, b);
for (int i = 0; i < list.size(); i++) {
char c = mapIntToChar(list.get(i));
System.out.print(c);
}
System.out.println();
}
}
public static long changeToTenSystem(String s, int m){
char array[] = s.toCharArray();
int k = 1;
int result = 0;
for (int i = array.length-1; i >=0 ; i--) {
result += mapCharToLong(array[i])*k;
k = k*m;
}
return result;
}
public static long mapCharToLong(char c){
long result = -1;
if(c >= 'a' && c <= 'f'){
return (c-'a') + 10;
}else if( c >= 'A' && c <= 'F'){
return (c-'A') + 10;
}else{
return c - '0';
}
}
public static char mapIntToChar(Long n){
if(n >=0 && n <=9){
return (char)('0'+n);
}else{
return (char) ('A' + n - 10);
}
}
private static List<Long> changeToMSystem(long a, int m) {
List<Long> resultList = new ArrayList<Long>();
if(a == 0){
resultList.add(0L);
return resultList;
}
while(a != 0){
resultList.add(a%m);
a = a / m;
}
List<Long> list = new ArrayList<Long>();
for (int i = resultList.size()-1; i >=0; i--) {
list.add(resultList.get(i));
}
return list;
}
}
/**************************************************************
Problem: 1118
User: yihukurama
Language: Java
Result: Accepted
Time:360 ms
Memory:27964 kb
****************************************************************/
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:2438
解决:925
题目描述:
求任意两个不同进制非负整数的转换(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
提示:
可以用字符串表示不同进制的整数。
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main{
/**
* @param args
*/
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while( scanner.hasNext() ){
int a = scanner.nextInt();
String n = scanner.next();
int b = scanner.nextInt();
long result = changeToTenSystem(n, a);
List<Long> list = changeToMSystem(result, b);
for (int i = 0; i < list.size(); i++) {
char c = mapIntToChar(list.get(i));
System.out.print(c);
}
System.out.println();
}
}
public static long changeToTenSystem(String s, int m){
char array[] = s.toCharArray();
int k = 1;
int result = 0;
for (int i = array.length-1; i >=0 ; i--) {
result += mapCharToLong(array[i])*k;
k = k*m;
}
return result;
}
public static long mapCharToLong(char c){
long result = -1;
if(c >= 'a' && c <= 'f'){
return (c-'a') + 10;
}else if( c >= 'A' && c <= 'F'){
return (c-'A') + 10;
}else{
return c - '0';
}
}
public static char mapIntToChar(Long n){
if(n >=0 && n <=9){
return (char)('0'+n);
}else{
return (char) ('A' + n - 10);
}
}
private static List<Long> changeToMSystem(long a, int m) {
List<Long> resultList = new ArrayList<Long>();
if(a == 0){
resultList.add(0L);
return resultList;
}
while(a != 0){
resultList.add(a%m);
a = a / m;
}
List<Long> list = new ArrayList<Long>();
for (int i = resultList.size()-1; i >=0; i--) {
list.add(resultList.get(i));
}
return list;
}
}
/**************************************************************
Problem: 1118
User: yihukurama
Language: Java
Result: Accepted
Time:360 ms
Memory:27964 kb
****************************************************************/
相关文章推荐
- 题目1144:Freckles 最小生成树 2009年北京大学计算机研究生机试真题
- 题目1163:素数(2008年北京航空航天大学计算机研究生机试真题)
- 题目1080:进制转换(2008年清华大学计算机研究生机试真题)ps:用java太简单了
- 题目1163:素数 2008年北京航空航天大学计算机研究生机试真题
- 题目1144:Freckles(2009年北京大学计算机研究生机试真题)
- 题目1112:拦截导弹(2007年北京大学计算机研究生机试真题:动态规划)
- 九度机试 题目1165:字符串匹配 2008年北京航空航天大学计算机研究生机试真题
- 九度题目1042:Coincidence 2008年上海交通大学计算机研究生机试真题
- Is It A Tree?,判断是否是一棵树。(题目来源:九度OJ 1481,2012年北京大学计算机研究生机试真题)
- 九度机试 题目1165:字符串匹配 2008年北京航空航天大学计算机研究生机试真题
- 九度题目1113:二叉树 2007年北京大学计算机研究生机试真题
- 九度 题目1112:拦截导弹 2007年北京大学计算机研究生机试真题 动态规划
- 题目1026:又一版 A+B(2008年浙江大学计算机及软件工程研究生机试真题)
- 题目1042:Coincidence(2008年上海交通大学计算机研究生机试真题)
- 题目1027:欧拉回路 2008年浙江大学计算机及软件工程研究生机试真题
- 题目1153:括号匹配问题(2010年北京大学计算机研究生机试真题,堆栈的使用)
- 题目1009:二叉搜索树(2010年浙江大学计算机及软件工程研究生机试真题)
- 题目1047:素数判定(2009年哈尔滨工业大学计算机研究生机试真题)
- 九度题目1015:还是A+B && 2006年浙江大学计算机及软件工程研究生机试真题
- 简单的素数问题(2008年北京航空航天大学计算机研究生机试真题)