C ++程序在不同的计算机上提供不同的结果

时间:2016-06-09 17:59:25

标签: c++

我的代码为输入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

为什么会这样?我知道这可能是一个编译器问题但是这里真的发生了什么?

1 个答案:

答案 0 :(得分:1)

问题在于std::pow并不准确。这是一种近似算法。它返回的浮点结果可能会偏离一些非常小的数量。

将浮点数转换为整数时,可以通过删除小数部分将其向下舍入。但是,如果正确的结果是100,并且错误是-0.000...001,因此结果是99.999...999并且你切断了小数部分,那么你获得的整数是99。

如何实施std::pow是......特定于实施者。因此,错误可能是一个编译器/计算机中的一种方式,而另一种方式可能是另一种方式。这就是结果可能不同的原因。

解决方案:不要使用std::pow进行整数计算。

解决方法:首先将结果舍入到最接近的整数。