2

8 進数から 10 進数への変換アプリを作成しようとしています。

問題は、戻り値が本来あるべき値よりも 1 少ないことです。例:

入力: 2426 (10 月)

戻る必要があります: 1302 (12 月)

返品: 1301 (12 月)

何が問題なのですか?誰かが知りたい場合は、最新の 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;
}

(ところで、私は母国語から英語に変数を翻訳したので、英語以外の変数がそう言っているのを見たら、私はそれを修正します)

4

3 に答える 3

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;
}
于 2012-10-08T18:53:35.793 に答える
1

アルゴリズムの丸めに問題があると思います。とにかく、これは変換を行う方法ではありません。途中で、数字を読み取って現在の値に追加するだけです。他に桁がある場合は、8 を掛けて繰り返します。

途中で、次の数字を形成するために 10 で割った余り (モジュラス) を取ります。次に、10 で除算し、結果が非​​ゼロの間、繰り返します。

于 2012-10-08T18:49:06.587 に答える
0

あなたのコードをテストしましたが、期待通りの値を出力しています。私が遭遇した唯一の問題は、丸めに関するものでした。pow()関数呼び出しをpowf()に変更し、その関数の結果を整数にキャストしました。

これは私がテストしたコードです (VS2010 C++ プロジェクト):

#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;
}
于 2012-10-08T18:47:55.793 に答える