-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

当您拥有前两个数字的位数时,您就拥有了检查汇总数字所需的一切。您只需为前两个数字生成所有有效的数字组合。数字之和不应大于所有数字的一半,因为否则第三个数字,即前两个数字之和,将不适合总数的其余部分。生成所有数字组合的最佳方法是这个嵌套循环:

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函数最简单的方法是通过字符串比较。首先将聚合数字转换为字符串。然后在循环中使用第一个和第二个数字生成应该是聚合数的子字符串的字符串,并将这些子字符串与聚合数的适当部分进行比较。如果一切都检查到结束返回 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 回答