Функция возвращает результат на 1 меньше, чем должен быть

Я пытаюсь написать восьмеричное в десятичное приложение преобразования.

Проблема в том, что возвращаемое значение на 1 меньше, чем должно быть, например:

ВХОД: 2426 (ОКТЯБРЬ)

ДОЛЖЕН ВЕРНУТЬСЯ: 1302 (ДЕК)

ВОЗВРАТ: 1301 (ДЕК)

Есть идеи что не так? Я использую новейшие Code :: Blocks, если кто-то хочет знать.

Вот мой код:

int oct2dec (int number) {
int system  = 8;
int length  = IntegerLength(number);
int power   = length - 1;
int result  = 0;
int partial = 0;

do {
partial = part_nr(number);
cout<<"czastka: "<<partial<<endl;
result = result + (partial * pow(system,power));
number = number - (partial * pow(10,power));
power--;

} while (number>0);
return result;
}

функция part_nr:

int part_nr(int number) {
int multipler = 1;
int result    = 0;
do {
int temp=number/multipler;
if(temp<10) result = temp;
multipler = multipler*10;
} while (result == 0);
return result;
}

Функция IntegerLength:

int IntegerLength(int value) {
int divisor = 10;
int length  = 1;
while(value >= divisor)
{
value = (value - (value % divisor)) / divisor;
length ++;
}

return length;
}

(Кстати. Я перевел переменные с моего родного языка на английский, поэтому, если вы видите любую переменную не-англоговорящего типа, я исправлю это)

2

Решение

Я проверил ваш код, и он выводит значение, которое вы ожидаете ожидать. Единственная проблема, с которой я столкнулся, была с округлением. Я изменил POW () вызов функции для powf (), и затем я приведу результат этой функции к целому числу.

Вот код, который я тестировал (VS2010 C ++ Project):

#include "stdafx.h"#include <iostream>
#include <cmath>
using namespace std;

int part_nr(int number) {
int multipler = 1;
int result    = 0;
do {
int temp=number/multipler;
if(temp<10) result = temp;
multipler = multipler*10;
} while (result == 0);
return result;
}int IntegerLength(int value) {
int divisor = 10;
int length  = 1;
while(value >= divisor)
{
value = (value - (value % divisor)) / divisor;
length++;
}
return length;
}

int oct2dec (int number) {
int system  = 8;
int length  = IntegerLength(number);
int power   = length - 1;
int result  = 0;
int partial = 0;

do {
partial = part_nr(number);
cout<<"czastka: "<<partial<< endl;
result = result + (partial * (int)powf(system,power));
number = number - (partial * (int)powf(10,power));
power--;

} while (number>0);
return result;
}
int _tmain(int argc, _TCHAR* argv[])
{
int res = oct2dec(2426);
cout << "res is " << res << endl;
getchar();
return 0;
}
0

Другие решения

Я думаю, у вас просто проблемы с округлением в вашем алгоритме. Во всяком случае, это не способ сделать преобразование в любом случае: по пути вы просто читаете цифру и добавляете ее к текущему значению. Если есть еще одна цифра, вы умножаете на 8 и повторяете.

На выходе вы берете остаток (модуль) деления на 10, чтобы сформировать следующую цифру. Затем вы делите на 10, и пока результат не равен нулю, вы повторяете.

1

Вы можете сделать это намного проще, чем то, что вы пытаетесь сделать. Например:

unsigned int oct2dec(unsigned int oct) {
int dec = 0, m = 1;

while (oct > 0) {
dec += m * (oct % 10);
oct /= 10;
m *= 8;
}
return dec;
}
1
По вопросам рекламы [email protected]