长有什么问题?为什么自动减去 1?

What's wrong with long? Why is subtracting 1 automatically?

本文关键字:为什么 什么 问题      更新时间:2023-10-16
#include <iostream>
#include <math.h>
#include <algorithm>
using namespace std;
int main() {
int t, c1, c2, res;
string str1, str2;
cin >> t;
for (int i = 0; i < t; i++) {
c1 = c2 = res = 0;
cin >> str1 >> str2;
c1 = count(str1.begin(), str1.end(), '1');
c2 = count(str2.begin(), str2.end(), '1');
cout << (long)(((pow(10, c1) - 1) / 9) * ((pow(10, c2) - 1) / 9)) << 'n';
}
}

对于输入:

1
11111 11111

输出为:

123454321

但是,这就是问题所在,

对于输入:

1
10101 10100

输出为:

1220

此外,对于

1
11000 11000

输出:

120

我不明白如果答案的长度小于 1,为什么长从最终答案中减去 4

注意:在这里,输入字符串的长度为<= 10^5

某些pow实现返回不准确的结果,即使确切的结果是可表示的。Microsoft的pow实现因此而臭名昭著。

(long)(((pow(10, c1) - 1) / 9) * ((pow(10, c2) - 1) / 9))中,pow返回的值略小于正确的值,例如返回 99999.999999999985448084771633148193359375 而不是 100000。这导致算术的其余部分产生的值略小于 1221 而不是 1221。当它被转换为long时,分数被截断,产生1220

理想情况下,有足够多的人会抱怨Microsoft这个问题,或者其他pow例程不好的发布者,他们会修复它。

如果存在该问题,您可以通过将pow结果舍入到最接近的整数(如round函数(或通过编写自己的幂例程来满足您的目的来解决它。

相关文章: