2016-06-09 74 views
3

我的代码正在为输入100打印192(这是所需的结果)。但是当我把它提交给在线裁判时,它显示我的程序输出100的输出是190.我复制并粘贴了ideone.com中的代码并输入了100我得到了结果192.我将它发送给我的朋友而在他的电脑上,输出是190.但他也将代码提交到ideone.com并得到了192个。问题是什么?这里是我的代码:C++程序在不同的计算机上给出不同的结果

#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

阅读CodeChef有关如何处理输入和输出的指南! :) – Ajay

+0

注意,[不要'#include '](https://stackoverflow.com/questions/31816095/why-should-i-not-include-bits-stdc-h ) – CoryKramer

+0

为什么不包含? –

回答

1

问题是std::pow不准确。这是一个近似算法。它返回的浮点结果可能会有一些非常小的数值。

当您将浮点数转换为整数时,通过删除小数部分将其舍入。但是,如果正确的结果会一直说100,误差为-0.000...001,因此结果是99.999...999,你切断小数部分,那么你得到的整数为99

std::pow实现如何。 ..具体到实施者。因此,错误可能是一种编译器/计算机的一种方式,但另一种方式可能是另一种方式。这就是结果可能不同的原因。

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

解决方法:将结果取整为最接近的整数。

+0

它的工作。谢谢! –

+0

@RedwanulSourav无需感谢,这就是upvote按钮的用途。并且不要忘记将最有帮助的答案标记为已接受:) – user2079303

相关问题