2016-06-09 5 views
3

Мой код печатает 192 для ввода 100 (что является желаемым результатом). Но когда я отправляю его в онлайн-судье, он показывает, что выход моей программы для ввода 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

Смежные вопросы