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 }

算法还有一些瑕疵。

时间: 2024-10-15 14:31:25

N进制加法的相关文章

HDU1720 A+B Coming (16进制加法)

16进制加法 1 #include<stdio.h> 2 int main() 3 { 4 int a,b; 5 while(scanf("%x %x",&a,&b)!=EOF) 6 { 7 printf("%d\n",a+b); 8 } 9 } HDU1720 A+B Coming (16进制加法),码迷,mamicode.com

ACM--26进制加法--HDOJ 2100--Lovekey--大数--字符串处理

HDOJ题目地址:传送门 Lovekey Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7783    Accepted Submission(s): 2519 Problem Description XYZ-26进制数是一个每位都是大写字母的数字. A.B.C.-.X.Y.Z 分别依次代表一个0 ~ 25 的数字,一个 n 位的26

洛谷 P1604 B进制星球 高精度多进制加法

P1604 B进制星球 时空限制1s / 128MB 题目背景 进制题目,而且还是个计算器~~ 题目描述 话说有一天,小Z乘坐宇宙飞船,飞到一个美丽的星球.因为历史的原因,科技在这个美丽的星球上并不很发达,星球上人们普遍采用B(2<=B<=36)进制计数.星球上的人们用美味的食物招待了小Z,作为回报,小Z希望送一个能够完成B进制加法的计算器给他们. 现在小Z希望你可以帮助他,编写实现B进制加法的程序. 输入输出格式 输入格式: 共3行第1行:一个十进制的整数,表示进制B.第2-3行:每行一个B

36进制加法

36进制由0-9,a-z,共36个字符表示,最小为’0’, ‘0’.'9’对应十进制的09,‘a’.'z’对应十进制的1035 例如: '1b' 换算成10进制等于 1 * 36^1 + 11 * 36^0 = 36 + 11 = 47 要求按照加法规则计算出任意两个36进制正整数的和 如:按照加法规则,计算'1b' + '2x' = '48' 要求: 不允许把36进制数字整体转为10进制数字,计算出10进制数字的相加结果再转回为36进制 思路按照十进制的加法方法,满36向前进一位 public

B进制加法(洛谷1604)

分析:码农题,照这模拟就行,高精度的B进制,注意字符串反转的技巧. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <string> 5 #include <vector> 6 #include <algorithm> 7 #include <set> 8 #include <map> 9 #include &l

4进制加法-C++实现-分类讨论

思路: 1. 分四类讨论 2. 得到加和减计算方法 3. 前导0删除与符号删除 #include<iostream> #include<string> #include<iomanip> using namespace std; // 输入4进制数格式判断 bool judge(string a) { int i = 0; if(a[i] == '-' || a[i] == '+') i++; if(a[i] == '0' && a.size()-1&g

python任意进制加法

#!/usr/bin/python import sys,time start = sys.argv[1] end = sys.argv[2] size = sys.argv[3] def add(start,end,size): def add1(number,size): number[-1] += 1 if number[-1] == size: del number[-1] if number == []: number.append(1) else: if number[-1] ==

用74LS90或74LS193设计24进制加法计数器,用数码管显示其结果

原文地址:https://www.cnblogs.com/chunk998/p/11824365.html

高精度加法(进制)

1 /* 2 高精度进制加法 3 n为进制(n<=36) 4 */ 5 #include<bits/stdc++.h> 6 using namespace std; 7 const int maxn=10000; 8 int n; 9 struct bign{ 10 int d[maxn],len; 11 inline bign(){len=1;memset(d,0,sizeof(d));} 12 inline bign operator = (const char* num) 13 {