> 文章列表 > 【华为OD机试真题 C++】1071 - N进制减法 | 机试题+算法思路+考点+代码解析

【华为OD机试真题 C++】1071 - N进制减法 | 机试题+算法思路+考点+代码解析

【华为OD机试真题 C++】1071 - N进制减法 | 机试题+算法思路+考点+代码解析

文章目录

    • 一、题目
      • 🔸题目描述
      • 🔸输入输出
      • 🔸样例1
      • 🔸样例2
    • 二、代码参考
  • 作者:KJ.JK

🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈
 
🍂个人博客首页: KJ.JK
 
💖系列专栏:华为OD机试真题(C++)


一、题目


🔸题目描述

主管期望你实现一个基于字符串的N进制的减法。
 
需要对输入的两个字符串按照给定的N进制进行减法操作,输出正负符号和表示结果的字符串。


🔸输入输出

输入
输入有三个参数:
1、第一个参数是整数形式的进制N值,N值范围为大于等于2、小于等于35。
2、第二个参数为被减数字符串;
3、第三个参数为减数字符串。
 
有效的字符包括0-9以及小写字母a-z,字符串有效字符个数最大为100个字符,另外还有结尾的\\0。
 
限制:
输入的被减数和减数,除了单独的0以外,不能是以0开头的字符串。
 
如果输入有异常或计算过程中有异常,此时应当输出-1表示错误。
 
输出
 
输出有2个。
 
其一为减法计算的结果,-1表示出错,0表示结果为整数, 1表示结果为负数。
 
其二为表示结果的字符串。


🔸样例1

输入
2 11 1输出
0 10说明:
按二进制计算11-1,计算正常, 0表示符号为正数,结果为10

🔸样例2

输入
8 07 1输出
-1说明:
按8进制,检查到减数不符合非0前导的要求,返回结果为-1,没有其他结果内容。

二、代码参考

#include <iostream>
#include <string>
#include <regex>using namespace std;string covertStr = "0123456789abcdefghigklmnopqrstuvwxyz";// 将十进制数num转为base进制数
string toBase(int num, int base) {if (num < base) {return string(1, covertStr[num]);} else {return toBase(num / base, base) + covertStr[num % base];}
}bool isValid(string s, int n) {//  含前导的0只有0值本身合法if (s[0] == '0') {return s == "0";}// 被减数,减数只能包含字符0-9,a-zif (regex_search(s, regex("[^0-9a-z]"))) {return false;}// 被减数,减数长度最多100if (s.length() > 100) {return false;}// 被减数,减数的每位不能超过nfor (char c : s) {if (isdigit(c) && c - '0' >= n) {  // 比如2进制数的每一位不能超过2return false;} else if (isalpha(c) && c - 'a' + 10 >= n) {  // 比如16进制数每一位不能超过freturn false;}}return true;
}int main() {string n, b_sub, sub;cin >> n >> b_sub >> sub;int base = stoi(n);if (base < 2 || base > 35) {cout << "-1" << endl;return 0;}if (!isValid(b_sub, base) || !isValid(sub, base)) {cout << "-1" << endl;return 0;}int b_sub_val = stoi(b_sub, nullptr, base);int sub_val = stoi(sub, nullptr, base);string diff = toBase(abs(b_sub_val - sub_val), base);string sign = b_sub_val >= sub_val ? "0" : "1";cout << sign + " " + diff << endl;return 0;
}

作者:KJ.JK

文章对你有所帮助的话,欢迎给个赞或者 star,你的支持是对作者最大的鼓励,不足之处可以在评论区多多指正,交流学习