华为OD机试真题 - N进制减法
static char[] map = new char[35];
public static void main(String[] args) {
for (int i = 0; i < map.length; i++) {
if (i < 10)
map[i] = (char) ('0' + i);
else
map[i] = (char) ('a' + i - 10);
}
Scanner inputScanner = new Scanner(System.in);
int base = inputScanner.nextInt();
String num1 = inputScanner.next(); // 被减数
String num2 = inputScanner.next(); // 减数
StringBuilder num1Builder = new StringBuilder(num1);
StringBuilder num2Builder = new StringBuilder(num2);
if (num1Builder.length() > num2Builder.length()) {
System.out.print(0 + " ");
System.out.print(getResult(num1Builder, num2Builder, base));
} else if (num1Builder.length() < num2Builder.length()) {
System.out.print(1 + " ");
System.out.println(getResult(num2Builder, num1Builder, base));
} else {
for (int i = 0; i < num1Builder.length(); i++) {
if (num1Builder.charAt(i) > num2Builder.charAt(i)) {
System.out.print(0 + " ");
System.out.print(getResult(num1Builder, num2Builder, base));
break;
} else if (num1Builder.charAt(i) < num2Builder.charAt(i)){
System.out.print(1 + " ");
System.out.println(getResult(num2Builder, num1Builder, base));
break;
}
if (num1Builder.length() - 1 == i) {
System.out.print(0 + " ");
System.out.print(0);
}
}
}
}
public static String getResult(StringBuilder num1Builder, StringBuilder num2Builder, int base) {
StringBuilder ans = new StringBuilder();
num1Builder.reverse();
num2Builder.reverse();
for (int i = 0; i < num1Builder.length(); i++) {
if (i >= num2Builder.length()) {
ans.append(num1Builder.substring(i, num1Builder.length()));
break;
}
char num1 = num1Builder.charAt(i);
char num2 = num2Builder.charAt(i);
if (num1 >= num2)
ans.append(map[num1 - num2]);
else {
backtrack(num1Builder, 1 , i, base);
ans.append(map[num1 + base - num2]);
}
}
return ans.reverse().toString();
}
public static void backtrack(StringBuilder num1Builder, int index, int i, int base) {
if (num1Builder.charAt(i + index) != '0') {
char ch = num1Builder.charAt(i + index);
num1Builder.delete(i + index, i + index + 1);
num1Builder.insert(i + index, (char)(ch - 1));
} else {
backtrack(num1Builder, index + 1 , i, base);
num1Builder.delete(i + index, i + index + 1);
num1Builder.insert(i + index, (char)(base - 1));
}
}
public static void main(String[] args) {
for (int i = 0; i < map.length; i++) {
if (i < 10)
map[i] = (char) ('0' + i);
else
map[i] = (char) ('a' + i - 10);
}
Scanner inputScanner = new Scanner(System.in);
int base = inputScanner.nextInt();
String num1 = inputScanner.next(); // 被减数
String num2 = inputScanner.next(); // 减数
StringBuilder num1Builder = new StringBuilder(num1);
StringBuilder num2Builder = new StringBuilder(num2);
if (num1Builder.length() > num2Builder.length()) {
System.out.print(0 + " ");
System.out.print(getResult(num1Builder, num2Builder, base));
} else if (num1Builder.length() < num2Builder.length()) {
System.out.print(1 + " ");
System.out.println(getResult(num2Builder, num1Builder, base));
} else {
for (int i = 0; i < num1Builder.length(); i++) {
if (num1Builder.charAt(i) > num2Builder.charAt(i)) {
System.out.print(0 + " ");
System.out.print(getResult(num1Builder, num2Builder, base));
break;
} else if (num1Builder.charAt(i) < num2Builder.charAt(i)){
System.out.print(1 + " ");
System.out.println(getResult(num2Builder, num1Builder, base));
break;
}
if (num1Builder.length() - 1 == i) {
System.out.print(0 + " ");
System.out.print(0);
}
}
}
}
public static String getResult(StringBuilder num1Builder, StringBuilder num2Builder, int base) {
StringBuilder ans = new StringBuilder();
num1Builder.reverse();
num2Builder.reverse();
for (int i = 0; i < num1Builder.length(); i++) {
if (i >= num2Builder.length()) {
ans.append(num1Builder.substring(i, num1Builder.length()));
break;
}
char num1 = num1Builder.charAt(i);
char num2 = num2Builder.charAt(i);
if (num1 >= num2)
ans.append(map[num1 - num2]);
else {
backtrack(num1Builder, 1 , i, base);
ans.append(map[num1 + base - num2]);
}
}
return ans.reverse().toString();
}
public static void backtrack(StringBuilder num1Builder, int index, int i, int base) {
if (num1Builder.charAt(i + index) != '0') {
char ch = num1Builder.charAt(i + index);
num1Builder.delete(i + index, i + index + 1);
num1Builder.insert(i + index, (char)(ch - 1));
} else {
backtrack(num1Builder, index + 1 , i, base);
num1Builder.delete(i + index, i + index + 1);
num1Builder.insert(i + index, (char)(base - 1));
}
}
全部评论
相关推荐
09-13 16:51
重庆大学 C++ 点赞 评论 收藏
分享
09-03 21:56
山东建筑大学 算法工程师 点赞 评论 收藏
分享
08-28 12:16
四川轻化工大学 前端工程师 Mush3r:1. 项目包装一下,比如说“跟某某电网/企业合作,已经实际交付”之类的,这样别人就觉得你至少是个实际的项目不是个玩具项目;
2. 对于 axios 这种工具,不要写“利用”,别人觉得是就是在调包,没什么技术含量,要写“重新封装”,可能实际上就是封装了一些 url 前缀之类的,但是听起来就更高级一点;
3. 结合缓存实现用户登陆,你作为前端是如何实现的?如何鉴权?token 过期如何设置?如何保证非登录用户不能访问页面/请求拦截器?一个都写没,前面这些都是面试会问的问题,但是面试官看了你这句话可能也不知道该问什么;
4. 利用 Vue3,通过 。。。 组件库,又是调包,这种没什么工作量,就是拿过来用一用的就不要往详情里写了,开头总结的时候提一嘴就行了;
后面小程序不怎么懂,不评价了
点赞 评论 收藏
分享