Я пытаюсь написать восьмеричное в десятичное приложение преобразования.
Проблема в том, что возвращаемое значение на 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;
}
(Кстати. Я перевел переменные с моего родного языка на английский, поэтому, если вы видите любую переменную не-англоговорящего типа, я исправлю это)
Я проверил ваш код, и он выводит значение, которое вы ожидаете ожидать. Единственная проблема, с которой я столкнулся, была с округлением. Я изменил 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;
}
Я думаю, у вас просто проблемы с округлением в вашем алгоритме. Во всяком случае, это не способ сделать преобразование в любом случае: по пути вы просто читаете цифру и добавляете ее к текущему значению. Если есть еще одна цифра, вы умножаете на 8 и повторяете.
На выходе вы берете остаток (модуль) деления на 10, чтобы сформировать следующую цифру. Затем вы делите на 10, и пока результат не равен нулю, вы повторяете.
Вы можете сделать это намного проще, чем то, что вы пытаетесь сделать. Например:
unsigned int oct2dec(unsigned int oct) {
int dec = 0, m = 1;
while (oct > 0) {
dec += m * (oct % 10);
oct /= 10;
m *= 8;
}
return dec;
}