我正在尝试将八进制写入十进制转换应用程序。
问题是返回值比它应该少1,例如:
INPUT:2426(OCT)
应该返回:1302(DEC)
退货:1301(DEC)
任何想法有什么不对?如果有人想知道,我正在使用最新的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;
}
(顺便说一下。我已经将变量从我的原生语言翻译成英语,所以如果你看到任何非英语变量这样说,我会纠正它)
答案 0 :(得分:1)
我认为你的算法四舍五入存在问题。无论如何,这仍然是不进行转换的方式:在进入的过程中,您只需读取数字并将其添加到当前值。如果有另一个数字,则乘以8并重新计算。
在出路时,你将除法的余数(模数)乘以10以形成下一个数字。然后你除以10,而结果是非零,你重复。
答案 1 :(得分: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;
}
答案 2 :(得分:0)
我已经测试了您的代码,并且输出了您声称的预期值。我遇到的唯一问题是舍入。我将 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;
}