我是网络公司的一名普通程序员,英文名Steven,发音比较像“师弟”,自从入职培训自我介绍后,大家就称我为“二师弟”,我喜欢看科幻小说,也喜欢做梦,有一次梦到外星球,发现外星人使用的并非10进制/16进制等,有些星球居然使用N进制(据统计N都在2~35之间),现在我们将首先给您一个数字表示N进制,然后给出两个数字的字符串,请算出其求和结果并输出,如果输入不能正常计算则输出-1。

说明:
1:数字的字符串其中包括0-9和a-z(表示10-35)。
2:所有的输入和输出都只会是小写字母或数字,不存在其他字符。

输入:

整形数:计算进制
字符串:计算数1
字符串:计算数2

代码如下:

 import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner; public class Main { public static void main(String[] args){
Map<String, Integer> string2IntegerMap=new HashMap();
ArrayList<String> keys=new ArrayList();
Integer tempValue=10;
char initChar='a';
for (int i = 0; i <=9; i++) {
keys.add(String.valueOf(i));
}
//keys.add(String.valueOf(initChar));
for (int i = 10; i <36; i++) {
//System.out.println(initChar);
keys.add(String.valueOf(initChar));
string2IntegerMap.put(String.valueOf(initChar), tempValue);
tempValue=tempValue+1;
initChar=(char) (initChar+1); }
for (int i = 0; i <=9; i++) {
string2IntegerMap.put(String.valueOf(i), i);
}
String ss=add(string2IntegerMap,keys);
System.out.println(ss);
}
public static String add(Map string2IntegerMap,ArrayList keys){
Scanner scanner=new Scanner(System.in);
//scanner.useDelimiter("\r\n");
int radix=scanner.nextInt();
String leftValueString=scanner.next();
String rightValueString=scanner.next();
StringBuilder sb=new StringBuilder(); int leftValueStringSize=leftValueString.length();
int rightValueStringSize=rightValueString.length();
int minSize=leftValueStringSize<rightValueStringSize?leftValueStringSize:rightValueStringSize;
int maxSize=leftValueStringSize>rightValueStringSize?leftValueStringSize:rightValueStringSize;
//int biggerFlag;
int leftValue,rightValue;
boolean carry=false;
int result;
for (int i = 0; i < minSize; i++) {
leftValue=(int) string2IntegerMap.get(String.valueOf(leftValueString.charAt(--leftValueStringSize)));
rightValue=(int) string2IntegerMap.get(String.valueOf(rightValueString.charAt(--rightValueStringSize)));
if (leftValue<radix&&rightValue<radix) {
result=leftValue+rightValue;
if (carry) {
result++;
carry=false;
}
if (result>=radix) {
carry=true;
result-=radix;
}
sb.insert(0, keys.get(result));
}
}
if ((minSize==maxSize)&&carry) {
sb.insert(0, 1);
}
int tempValue;
//carry=false;
if (leftValueStringSize>0) {
for (int i = leftValueStringSize-1; i >=0; i--) {
tempValue=(int) string2IntegerMap.get(String.valueOf(leftValueString.charAt(i)));
if (carry) {
tempValue++;
carry=false;
}
if (tempValue>=radix) {
tempValue-=radix;
carry=true;
}
sb.insert(0,keys.get(tempValue));
} if (carry) {
sb.insert(0, 1);
} }
else if (rightValueStringSize>0) {
for (int i = rightValueStringSize-1; i >=0; i--) {
tempValue=(int) string2IntegerMap.get(String.valueOf(rightValueString.charAt(i)));
if (carry) {
tempValue++;
carry=false;
}
if (tempValue>=radix) {
tempValue-=radix;
carry=true;
}
sb.insert(0,keys.get(tempValue));
}
if (carry) {
sb.insert(0, 1);
} }
//StringBuilder sb2=new StringBuilder();
String sss= sb.toString();
return sss;
}
}

算法还有一些瑕疵。

N进制加法的更多相关文章

  1. B进制加法(洛谷1604)

    分析:码农题,照这模拟就行,高精度的B进制,注意字符串反转的技巧. #include <iostream> #include <cstdio> #include <cst ...

  2. hdu2100 26进制加法

    题意:       给你两个26进制数,让你算出他们两个的和. 思路:      水题不解释了,注意这样的数据 AAA AAA 输出A #include<stdio.h> #include ...

  3. XDU 1003 B进制加法(高精度)

    #include<bits/stdc++.h> using namespace std; long long mpow(long long a,long long b) { ; ) ; w ...

  4. noip 1998 洛谷P1013 进制位

    题目描述 著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母代表数字. 例如: L K V E L L K V E K K V E KL V V E KL KK E E K ...

  5. 洛谷 P1013 进制位 【搜索 + 进制运算】

    题目描述 著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母代表数字. 例如: + L K V E L L K V E K K V E KL V V E KL KK E E ...

  6. 洛谷P1013 进制位

    P1013 进制位 题目描述 著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母代表数字. 例如: + L K V E L L K V E K K V E KL V V E ...

  7. [NOIP1998] 提高组 洛谷P1013 进制位

    题目描述 著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母代表数字. 例如: L K V E L L K V E K K V E KL V V E KL KK E E K ...

  8. [NOIP1999]进制位(搜索)

    P1013 进制位 题目描述 著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母代表数字. 例如: + L K V E L L K V E K K V E KL V V E ...

  9. 洛谷 P1013 进制位

    P1013 进制位 题目描述 著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母代表数字. 例如: + L K V E L L K V E K K V E KL V V E ...

随机推荐

  1. fs.watch 爬坑

    上星期用 fs.watch 和 readline.createInterface 对pm2的合并日志做了监控,根据指定的错误信息重启服务 发现不管是手动vim编辑日志,还是等待日志自动输出. fs.w ...

  2. 链接oracle数据库 生成表对应的javabean

    package com.databi.utils; import java.io.File; import java.io.FileOutputStream; import java.io.IOExc ...

  3. Java并发(6)- CountDownLatch、Semaphore与AQS

    引言 上一篇文章中详细分析了基于AQS的ReentrantLock原理,ReentrantLock通过AQS中的state变量0和1之间的转换代表了独占锁.那么可以思考一下,当state变量大于1时代 ...

  4. Restful 接口权限控制

    前言 有人说,每个人都是平等的: 也有人说,人生来就是不平等的: 在人类社会中,并没有绝对的公平, 一件事,并不是所有人都能去做: 一样物,并不是所有人都能够拥有. 每个人都有自己的角色,每种角色都有 ...

  5. 鼠标DPI和液晶显示器分辨率的关系

    鼠标DPI和液晶显示器分辨率的关系 说起鼠标,有两个性能指标是我们不能忽略的.一是游戏玩家相当熟悉的扫描率(单位:Frames Per Second),二是我们今天要和大家探讨的鼠标的分辨率(单位:D ...

  6. WIN8.1优化

    用WIN8.1至今,总结的所有优化的办法! 从Win7.Win8.1开始,微软为我们带来完善的系统服务.任务计划程序,这些都一定程度提升了日常使用,实现了“半自动化.半智能化”交互体验.但是对于高级用 ...

  7. python学习笔记 异步asyncio

    asyncio是Python 3.4版本引入的标准库,直接内置了对异步IO的支持. asyncio的编程模型就是一个消息循环.我们从asyncio模块中直接获取一个EventLoop的引用,然后把需要 ...

  8. python基础===文件对象的访问模式,以及计数循环的使用方法

    案例一: 一个几M的文本文件,需要每隔100行写到新的文件中. 代码实现如下: with open(r'f:\book.txt','rb') as f1: with open(r'f:\book2.t ...

  9. 【转】JSP自定义标签

    转载自:http://www.cnblogs.com/edwardlauxh/archive/2010/05/20/1918587.html tld标签的描述文件 标签的描述文件是一个描述整个标签库标 ...

  10. golang中的反射

    反射操作普通变量 package main import ( "fmt" "reflect" ) func main(){ a := 1 //reflect.T ...