После компиляции следующей программы я получаю вывод «2346», но ожидал «2345».
#include<math.h>
#include<iostream.h>
int nr_cif(int a)
{
int k=0;
while(a!=0)
{
a = a/10;
k++;
}
return k;
}
void Nr(int &a){
int k = nr_cif(a);
a = a % (int)pow(10,k-1);
}int main()
{
int a = 12345;
Nr(a);
cout<<a;
}
После отладки я заметил, что он выдает ошибки после оценки:
a = a% (int) pow (10, k-1). Почему это ломается здесь?
Это не очень хорошая идея для использования pow
для целочисленной математики. Я бы изменил код следующим образом:
void Nr(int &a)
{
int ten_k = 1;
while (ten_k < a) ten_k *= 10;
a %= ten_k/10; // 10-to-the-(k-1)
}
В вашем коде нет ничего, что могло бы нуждаться в количестве десятичных цифр, кроме значения места. Так что сделайте значение места вашей переменной.
(Вы также можете использовать свой оригинальный цикл while, который лучше работает для отрицательных входных данных. Но рассчитайте и верните 10-к-k-степень вместо k).
Проблема с pow
заключается в том, что он работает со значениями с плавающей точкой и дает результаты, которые очень близки, но не точны. Ошибка может быть достаточной, чтобы вызвать округленное значение (после приведения к int
) ошибаться. Вы можете обойти это, добавив 0.5 перед приведением … но это не имеет смысла, так как умножение в вашем цикле быстрее, чем вызов pow
тем не мение.
Я не удивительный или не очень хорошо разбираюсь в математике, но это похоже на работу: http://ideone.com/dFsODB
#include <iostream>
#include <cmath>
float mypow(float value, int pow)
{
float temp = value;
for (int i = 0; i < pow - 1; ++i)
temp *= value;
for (int i = 0; i > pow - 1; --i)
temp /= value;
return temp;
}int main()
{
std::cout<<pow(10, -3)<<"\n";
std::cout<<mypow(10, -3)<<"\n";
return 0;
}