汇总数量

时间:2013-01-15 17:05:33

标签: algorithm

我正在努力解决这个问题,但无法提出任何建议......

如果此号码具有以下属性,我们将为“聚合号码”命名: 就像斐波那契数字一样 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

抱歉我们需要写一个不完整的问题来测试一个数字是否聚合? 任何想法请帮助

1 个答案:

答案 0 :(得分: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