函数返回的结果小于它应该的结果

时间:2012-10-08 18:35:23

标签: c++ codeblocks

我正在尝试将八进制写入十进制转换应用程序。

问题是返回值比它应该少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;
}

(顺便说一下。我已经将变量从我的原生语言翻译成英语,所以如果你看到任何非英语变量这样说,我会纠正它)

3 个答案:

答案 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;
}