N进制加法
我是网络公司的一名普通程序员,英文名Steven,发音比较像“师弟”,自从入职培训自我介绍后,大家就称我为“二师弟”,我喜欢看科幻小说,也喜欢做梦,有一次梦到外星球,发现外星人使用的并非10进制/16进制等,有些星球居然使用N进制(据统计N都在2~35之间),现在我们将首先给您一个数字表示N进制,然后给出两个数字的字符串,请算出其求和结果并输出,如果输入不能正常计算则输出-1。 说明: 1:数字的字符串其中包括0-9和a-z(表示10-35)。 2:所有的输入和输出都只会是小写字母或数字,不存在其他字符。
输入:
整形数:计算进制
字符串:计算数1
字符串:计算数2
代码如下:
1 import java.util.ArrayList; 2 import java.util.HashMap; 3 import java.util.Map; 4 import java.util.Scanner; 5 6 7 public class Main { 8 9 public static void main(String[] args){ 10 Map<String, Integer> string2IntegerMap=new HashMap(); 11 ArrayList<String> keys=new ArrayList(); 12 Integer tempValue=10; 13 char initChar='a'; 14 for (int i = 0; i <=9; i++) { 15 keys.add(String.valueOf(i)); 16 } 17 //keys.add(String.valueOf(initChar)); 18 for (int i = 10; i <36; i++) { 19 //System.out.println(initChar); 20 keys.add(String.valueOf(initChar)); 21 string2IntegerMap.put(String.valueOf(initChar), tempValue); 22 tempValue=tempValue+1; 23 initChar=(char) (initChar+1); 24 25 } 26 for (int i = 0; i <=9; i++) { 27 string2IntegerMap.put(String.valueOf(i), i); 28 } 29 String ss=add(string2IntegerMap,keys); 30 System.out.println(ss); 31 } 32 public static String add(Map string2IntegerMap,ArrayList keys){ 33 Scanner scanner=new Scanner(System.in); 34 //scanner.useDelimiter("\r\n"); 35 int radix=scanner.nextInt(); 36 String leftValueString=scanner.next(); 37 String rightValueString=scanner.next(); 38 StringBuilder sb=new StringBuilder(); 39 40 int leftValueStringSize=leftValueString.length(); 41 int rightValueStringSize=rightValueString.length(); 42 int minSize=leftValueStringSize<rightValueStringSize?leftValueStringSize:rightValueStringSize; 43 int maxSize=leftValueStringSize>rightValueStringSize?leftValueStringSize:rightValueStringSize; 44 //int biggerFlag; 45 int leftValue,rightValue; 46 boolean carry=false; 47 int result; 48 for (int i = 0; i < minSize; i++) { 49 leftValue=(int) string2IntegerMap.get(String.valueOf(leftValueString.charAt(--leftValueStringSize))); 50 rightValue=(int) string2IntegerMap.get(String.valueOf(rightValueString.charAt(--rightValueStringSize))); 51 if (leftValue<radix&&rightValue<radix) { 52 result=leftValue+rightValue; 53 if (carry) { 54 result++; 55 carry=false; 56 } 57 if (result>=radix) { 58 carry=true; 59 result-=radix; 60 } 61 sb.insert(0, keys.get(result)); 62 } 63 } 64 if ((minSize==maxSize)&&carry) { 65 sb.insert(0, 1); 66 } 67 int tempValue; 68 //carry=false; 69 if (leftValueStringSize>0) { 70 for (int i = leftValueStringSize-1; i >=0; i--) { 71 tempValue=(int) string2IntegerMap.get(String.valueOf(leftValueString.charAt(i))); 72 if (carry) { 73 tempValue++; 74 carry=false; 75 } 76 if (tempValue>=radix) { 77 tempValue-=radix; 78 carry=true; 79 } 80 sb.insert(0,keys.get(tempValue)); 81 } 82 83 if (carry) { 84 sb.insert(0, 1); 85 } 86 87 } 88 else if (rightValueStringSize>0) { 89 for (int i = rightValueStringSize-1; i >=0; i--) { 90 tempValue=(int) string2IntegerMap.get(String.valueOf(rightValueString.charAt(i))); 91 if (carry) { 92 tempValue++; 93 carry=false; 94 } 95 if (tempValue>=radix) { 96 tempValue-=radix; 97 carry=true; 98 } 99 sb.insert(0,keys.get(tempValue)); 100 } 101 if (carry) { 102 sb.insert(0, 1); 103 } 104 105 } 106 //StringBuilder sb2=new StringBuilder(); 107 String sss= sb.toString(); 108 return sss; 109 } 110 }
算法还有一些瑕疵。