一、代码查看
1 #include <iostream> 2 #include <algorithm> 3 4 using namespace std; 5 6 const int MAXL = 1000; 7 8 int n, k, ans[MAXL]; 9 10 int main(void) 11 { 12 cin >> n >> k; 13 if (!n) cout << 0 << endl; 14 else 15 { 16 int m = 0; 17 while (n) 18 { 19 ans[m++] = (n % (-k) + k) % k; 20 n = (ans[m - 1] - n) / k; 21 } 22 for (int i = m - 1; i >= 0; i--) 23 cout << char(ans[i] >= 10 ? 24 ans[i] + 'A' - 10 : 25 ans[i] + '0'); 26 cout << endl; 27 } 28 return 0; 29 }
二、关于负数的除法与求余
负数的求余在不同的语言的编译器下运行结果不一样,以下是在C++语言中运行的效果。
负数的除法。
负数求余的符号由被除数决定!!!
三、题目分析
假设输入的 n 在 int 范围内,k 为不小于 2 且不大于 36 的正整数,完成下面的判断题和单选题:
判断题
1. 该算法的时间复杂度为O(logkn)。(对)
【循环从n开始,每次除以n,所以O(logkn)】
【**这道题我觉得很奇怪,如果n是负数怎么办?但正确答案是对的😂】
2. 删除第 23 行的强制类型转换,程序的行为不变。(错)
【删除后可能输出整数】
3. 除非输入的 n 为 0,否则程序输出的字符数为 ⌊logk∣n∣⌋+1。(对)
【⌊logk∣n∣⌋就是m】
单选题
4. 当输入为“100 7”时,输出为(A)。
A. 202
B. 1515
C. 244
D. 1754【 ans[0] = (100 % -7 + 7) % 7 = 100 % 7(因为100是正数所以也等于) = 2
n =(2 - 100)/ 7 = -14
ans[1] = -14 % -7 = 0
n = 14 / 7 = 2
ans[2] = 2 % -7 = 2 % 7 = 2
n = (2 - 2) / 7 = 0
ans = [2, 0, 2]
答案 = (要倒过来)202 】
5. 当输入为“-255 8”时,输出为(B)。
A. 1400
B. 1401
C. 417
D. 400【 ans[0] = (-255 % -8 + 8) % 8 = 1
n = (1 - -255) = 256 / 8 = 32
ans[1] = (32 % -8 + 8) % 8 = 32 % 8 = 0
n = -32 / 8 = -4
ans[2] = (-4 % -8 + 8) % 8 = 4
n = 8 / 8 = 1
ans[3] = 1 % -8 = 1 % 8(以后直接省略第一步) = 1
n = (1 - 1) / 8 = 0
ans[1, 0, 4, 1]
答案 = (要倒过来)1401 】
6. 当输入为“1000000 19”时,输出为(B)。
A. BG939
B. 87GIB
C. 1CD428
D. 7CF1B【 ans[0] = 1000000 % 19 = 11 (B)
n = (11 - 1000000) / 19 = -52631
ans[1] = (-52631 % -19 + 19) % 19 = 18 (I)
n = (18 - -52631) / 19 = 2771
到这里可以确定倒数第一第二位。
】
感谢阅读,如发现有错误请在评论区指正,谢谢 😊。