我的代码为输入100打印192(这是所需的结果)。但是当我在在线评判中提交它时,它显示我的输入100的程序输出是190.我复制并粘贴了ideone.com中的代码,输入100我得到结果192.我发送给我的朋友在他的电脑上输出是190.但他也将代码提交到ideone.com并获得192.问题是什么?这是我的代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
int main(){
lli in,ans = 0;
cin >> in;
if(in < 10)
cout << in << endl;
else{
lli digits = 0;
lli temp = in;
while(temp > 0){
digits++;
temp /= 10;
}
digits--;
while(in > 0){
//cout << "in: " << in << endl;
//cout << "digits: " << digits << endl;
ans += ((in - (pow(10,digits) - 1)) * (digits + 1));
in = in - (in - (pow(10,digits) - 1));
digits--;
if(in == 9){
ans+= 9;
break;
}
}
cout << ans << endl;
}
}
ideone链接:http://ideone.com/zOvHzW
为什么会这样?我知道这可能是一个编译器问题但是这里真的发生了什么?
答案 0 :(得分:1)
问题在于std::pow
并不准确。这是一种近似算法。它返回的浮点结果可能会偏离一些非常小的数量。
将浮点数转换为整数时,可以通过删除小数部分将其向下舍入。但是,如果正确的结果是100
,并且错误是-0.000...001
,因此结果是99.999...999
并且你切断了小数部分,那么你获得的整数是99。
如何实施std::pow
是......特定于实施者。因此,错误可能是一个编译器/计算机中的一种方式,而另一种方式可能是另一种方式。这就是结果可能不同的原因。
解决方案:不要使用std::pow
进行整数计算。
解决方法:首先将结果舍入到最接近的整数。