N进制加法
我是网络公司的一名普通程序员,英文名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进制加法的更多相关文章
- B进制加法(洛谷1604)
分析:码农题,照这模拟就行,高精度的B进制,注意字符串反转的技巧. #include <iostream> #include <cstdio> #include <cst ...
- hdu2100 26进制加法
题意: 给你两个26进制数,让你算出他们两个的和. 思路: 水题不解释了,注意这样的数据 AAA AAA 输出A #include<stdio.h> #include ...
- XDU 1003 B进制加法(高精度)
#include<bits/stdc++.h> using namespace std; long long mpow(long long a,long long b) { ; ) ; w ...
- 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 ...
- 洛谷 P1013 进制位 【搜索 + 进制运算】
题目描述 著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母代表数字. 例如: + L K V E L L K V E K K V E KL V V E KL KK E E ...
- 洛谷P1013 进制位
P1013 进制位 题目描述 著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母代表数字. 例如: + L K V E L L K V E K K V E KL V V E ...
- [NOIP1998] 提高组 洛谷P1013 进制位
题目描述 著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母代表数字. 例如: L K V E L L K V E K K V E KL V V E KL KK E E K ...
- [NOIP1999]进制位(搜索)
P1013 进制位 题目描述 著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母代表数字. 例如: + L K V E L L K V E K K V E KL V V E ...
- 洛谷 P1013 进制位
P1013 进制位 题目描述 著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母代表数字. 例如: + L K V E L L K V E K K V E KL V V E ...
随机推荐
- spring 配置文件读取 mysql username报错
在配置项目中,spring读取jdbc.properties文件连接mysql时报错: java.sql.SQLException: Access denied for user 'Admini ...
- 通过js修改微信内置浏览器title
document.setTitle = function(t) { document.title = t; var i = document.createElement('iframe'); i.sr ...
- python最简单发送邮件
#!/usr/bin/env python #coding:utf8 #Author:lsp #Date:下午5:51:13 #Version:0.1 #Function: #导入smtplib和MI ...
- C#与数据库的连接的三种方式
学习了.net的知识从C#一直到MVC,我一直觉得基础很重要,最近有复习一下数据库连接的三种方式 1 返回结果集的一张表 public static DataTable ExecuteDataTabl ...
- 【uva11855-求长度为1到n的相同子串出现的次数】sam
题意:求长度为1到n的相同子串出现的次数,输到小于2为止. 题解: 用sam做. 建机,算right集合,然后用r[i]更新长度为step[i]的子串出现次数,然后ans[i]=maxx(ans[i] ...
- 【Foreign】采蘑菇 [点分治]
采蘑菇 Time Limit: 20 Sec Memory Limit: 256 MB Description Input Output Sample Input 5 1 2 3 2 3 1 2 1 ...
- [ZOJ2341]Reactor Cooling解题报告|带上下界的网络流|无源汇的可行流
Reactor Cooling The terrorist group leaded by a well known international terrorist Ben Bladen is bul ...
- 智能合约安全-parity多重签名钱包安全漏洞
漏洞原因: 因为initWallet函数是公开函数( public function) , 攻击者调用initWallet,重新初始化钱包会把之前合约钱包所有者覆盖, 即可改变钱包所有者. 漏洞代码: ...
- 培训补坑(day7:线段树的区间修改与运用)(day6是测试,测试题解以后补坑QAQ)
补坑咯~ 今天围绕的是一个神奇的数据结构:线段树.(感觉叫做区间树也挺科学的.) 线段树,顾名思义就是用来查找一段区间内的最大值,最小值,区间和等等元素. 那么这个线段树有什么优势呢? 比如我们要多次 ...
- Pycharm中快捷键大全
#1.按住ctrl然后鼠标放在函数上就会提示出这个函数有那些参数,双击进入该函数. 1.Pycharm中快捷键大全,遇到一个更新一个 撤销与反撤销:Ctrl + z,Ctrl + Shift + z ...