2 条题解
-
0
本题思路:
-
高精度减法
-
将存储结果的数组转换成数字
-
进制转换
具体细节见注释
-
高精度减法:
lena = a.length(); lenb = b.length(); lenans = max(lena , lenb); //判断两数大小,若a<b则交换两数与其长度(swap函数) if (lena < lenb || (lena == lenb && a < b)) { swap(a , b); swap(lena , lenb); } //存储两数 for (int i = 0 ; i < lena ; i++) { numa[i] = a[lena - i - 1] - '0'; } for (int i = 0 ; i < lenb ; i++) { numb[i] = b[lenb - i - 1] - '0'; } //做减法 for (int i = 1 ; i <= lenans ; i++) { numans[i] = numa[i - 1] - numb[i - 1]; } //退位问题 for (int i = 1 ; i <= lenans ; i++) { if (numans[i] < 0) { numans[i] += 10; numans[i + 1]--; } }
-
将存储结果的数组转换成数字:
//求出最高位 int top = lenans; while (numans[top] == 0) top--; //转换成数字 for (int i = top ; i >= 1 ; i--) { //第一个细节,这里不能写成num += numans[i] * pow(10 , i - 1);,否则结果可能错误(真奇怪) long long d = numans[i] * pow(10 , i - 1);//第二个细节,这里是pow(10 , i - 1),不是pow(10 , i) num += d; }
-
进制转换
//还是用栈临时存储 stack<char> h; //进制转换 while (num > 0) { if (num % 16 > 9) h.push(num % 16 - 10 + 'A'); else h.push(num % 16 + '0'); num /= 16; } //第三个细节,若栈为空,则说明num=0,直接+'0'即可 if (h.empty()) ans += '0'; //翻转 while (!h.empty()) { ans += h.top(); h.pop(); }
-
- 1
信息
- ID
- 728
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 6
- 标签
- 递交数
- 27
- 已通过
- 11
- 上传者