题目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)。
-
样例输入:
-
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 ****************************************************************/