-2

私はこの問題を解決しようとしていますが、何も思いつきませんでした...

フィボナッチ数 1,1,2,3,5,8,13.....

数字の桁はいくつかの部分に分けることができ、後の部分は前の部分の合計です。

like 112358, because 1+1=2, 1+2=3, 2+3=5, 3+5=8
122436, because 12+24=36
1299111210, because 12+99=111, 99+111=210
112112224, because 112+112=224

不完全な質問で申し訳ありませんが、数値が集計されているかどうかをテストするために関数に書き込む必要がありますか? どんなアイデアでも助けてください

4

2 に答える 2

1

行き詰まっている場合は、問題をより単純な解決可能なチャンクに分割してみてください。たとえば、始めるには:

/**
 * Returns true if the provided number is an aggregated number
 *
 * @param potentialAggregatedNumber The number to check.
 */
boolean isAggregated (potentialAggregatedNumber){
    for(numDigits=1; numDigits <= (potentialAggregatedNumber.length/2); numDigits++){
        if(isAggregatedForFirstNumberLength(potentialAggregatedNumber, numDigits) {
            return true;
        }
    }
    return false;
}

/**
  * Returns true if aggregated number when the first number has numDigits digits.
  *
  * @param potentialAggregatedNumber The number to check.
  * @param numDigits The number of digits the first sub-number should have.
  */
boolean isAggregatedForFirstNumberLength(potentialAggregatedNumber, numDigits){
    //your code 
}
于 2013-01-15T17:35:10.117 に答える
0

最初の2つの数値の桁数がわかったら、集計された数値を確認するために必要なものがすべて揃っています。最初の2つの数字のすべての有効な数字の組み合わせを生成する必要があります。桁の合計は、すべての桁の半分より大きくすることはできません。そうしないと、最初の2つの数値の合計である3番目の数値が、総計の残りの数値に収まらないためです。数字のすべての組み合わせを生成する最良の方法は、このネストされたループです。

for (int both_digits = 2; both_digits * 2 <= total_digits; both_digits++)
{
  for (int first_digit = 1; first_digit < both_digits; first_digit++)
  {
    int second_digit = both_digits - first_digit;

    if (CheckAggregateNumber(aggregate_number, first_digit, second_digit))
      return true;
  }
}

CheckAggregateNumber関数を実装する最も簡単な方法は、文字列の比較です。まず、集計番号を文字列に変換します。次に、ループで、最初と2番目の数値を使用して集計番号のサブ文字列である文字列を生成し、これらのサブ文字列を集計番号の適切な部分と比較します。終了まですべてがチェックアウトされた場合はtrueを返し、そうでない場合はfalseを返します。ここにいくつかの擬似コードがあります:

aggregate_string = aggregate_number as string;
first_number = aggregate_string.Substring(0, first_digit) as int;
second_number = aggregate_string.Substring(first_digit, second_digit) as int;
index_on_aggregate = first_digit + second_digit;

begin loop
  new_number = first_number + second_number;
  new_string = new_number as string;

  if (new_string == aggregate_string.Substring(index_on_aggregate, new_string.Length)
    return false;

  first_number = second_number;
  second_number = new_number;
  index_on_aggregate = index_on_aggregate + new_string.Length;

  if (index_on_aggregate == aggregate_string.Length)
    return true;
end loop
于 2013-01-15T17:17:59.637 に答える