长有什么问题?为什么自动减去 1?
What's wrong with long? Why is subtracting 1 automatically?
#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
函数(或通过编写自己的幂例程来满足您的目的来解决它。
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 什么是 std::exception::what() 以及为什么要使用它?
- 此测试()中发生了什么意外过程?为什么总是覆盖 ch[0 1 2..]?
- 为什么无论你输入什么,这"while(cin.get(str,3))"只运行一次?
- 为什么此指针值不能转换为整数的规则是什么?
- 这是什么代码?为什么它有效?C++
- 为什么或在什么情况下,你会将参数作为C++中的引用(或指针)传递给函数?
- 您好,我实际上想了解以下代码.有人可以详细说明代码它到底在做什么吗?为什么它会在第 31 行崩溃
- 什么是流的标记,为什么流中只有 1 个标记?
- 什么是非营利组织???我的问题是我不明白为什么有人会使用它
- scanf( "%d" , array[i] + 1)是什么意思?为什么+1在那里?
- 什么'!((n % 5 != 0) ||(n % 20 == 0))'变身?为什么呢?我似乎不明白
- 长有什么问题?为什么自动减去 1?
- 为什么我在启动任务时收到成功代码,但它什么也不做?
- 为什么我应该在scanf()-家族成员中包含一个长度修饰符作为参数?有什么好处?使用长度修改器进行扫描的作用
- 为什么左值不能改变自己。左值用户是什么意思?
- 为什么我的代码说"Yes"什么时候应该说"No"?
- 这段代码中的arr[s[i]-'a']有什么用,为什么我们用"a"减去所有字符?
- C++ -- 为什么"什么"在捕获范围内打印"未知异常"?
- 为什么/什么时候我们应该更喜欢使用 std::swap;swap(a, b) over std::iter_swap(&a, &b)?