长期怎么了?为什么要自动减去1?

时间:2018-08-16 05:12:53

标签: c++ casting floating-point

#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

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

注意:此处,输入字符串的长度为<= 10 ^ 5

1 个答案:

答案 0 :(得分:2)

即使精确的结果是可表示的,某些pow实现也会返回不准确的结果。微软的pow实现为此而臭名昭著。

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

理想情况下,足够多的人会向Microsoft或其他pow常规错误的发布者抱怨,他们会解决此问题。

鉴于存在问题,您可以通过将pow结果四舍五入到最接近的整数(与round函数一样)或编写适合自己目的的电源例程来解决该问题。