0

入力番号、例 891 を取り、これらの各番号を配列に入力するプログラムを作成しようとしていまし x[0] = 8x[1] = 9x[2] = 1

メソッドを実装するために再帰を使用しようとしていました:

void calc(int val, int k)
{
    static int number = val;
    if((val/10))
    {
        calc(val/10, k--);
    }
    int x = number - val*pow(10, k);
    cout << x << ", k = " << k << " and number = " << number << endl;
}

int main()
{
    //write a program that converts a number to string
    int number;
    cout << "Enter a number: ";
    cin >> number;
    number = 891;
    int k = 0;

    //while(number/10 != 0)
        k = 2;

    calc(number, k);
}

基本的に、再帰関数を使用して数値を細かい部分に分解しようとしていますが、(in val): 91, 1, -8019 という出力が得られます。これを改善する方法はありますが、構造を維持していますか?

4

2 に答える 2

2

データを配列に入れることと、この問題を再帰的に解決することの両方で、少しのポインター演算が必要になります。事前に配列を割り当てる必要があります。つまり、桁数を知る必要があります。また、再帰呼び出しで配列に割り当てることができるように、配列へのポインタを渡す必要があります。以下は、これらの要件の両方に適合する短いソリューションです。

#import <math.h>
#import <iostream>
using namespace std;

void calc(int num, int* digs) {
  if (num > 0) {
    calc(num/10, digs-1); //recursive call, doing head recursion
    *digs = num %10; //assigning this digit
  }
}

int main() {
  //Get number from user
  int inputNumber;
  cout << "Input a number: ";
  cin >> inputNumber;

  int numDigits = log10(inputNumber) + 1;
  int outputArray[numDigits];

  //I give a pointer to the end of the array
  //This is because we are receiving digits from the end
  //So we traverse backwards from the end of the array
  calc(inputNumber, outputArray+numDigits-1);

  //Following is not logic, just printing
  for (int i=0; i < numDigits; i++) {
    cout << outputArray[i] << " ";
  }
  cout << endl;
}
于 2012-12-06T01:20:31.593 に答える
1
void calc(int val)
{
    cout << "digit:"<<val % 10<< " and number = " << val << endl;
    if((val/10))
    {
        calc(val/10);
    }
}

これにより、各桁が出力されます(これは、関数で実行しようとしているように見えます)。

于 2012-12-06T00:50:19.440 に答える