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("
");
 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 }

 算法还有一些瑕疵。

原文地址:https://www.cnblogs.com/lz3018/p/5330531.html