长了有什么问题吗?为什么会自动减1?

2024-03-09

#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

Output:

120

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

注意:这里,输入字符串的长度


Some pow即使可以表示准确的结果,实现也会返回不准确的结果。微软的pow实施过程因此而臭名昭著。

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

理想情况下,有足够多的人会向微软抱怨这一点,或者向其他不良出版商抱怨。pow例程,他们会修复它。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

长了有什么问题吗?为什么会自动减1? 的相关文章

随机推荐