#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
答案 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
函数一样)或编写适合自己目的的电源例程来解决该问题。