加法序列算法

6
我正在练习面试算法,并在Career CupSO上发现了这个问题。 加性数列是指当分解成两个不同的数字形式时为加性数列。
例如:1235(拆分为1、2、3、5)
例如:12122436(拆分为12、12、24、36)
给定一个范围,找出所有的加性数列?
以下是我尝试过的内容,我知道它不够高效,也不确定它的复杂度。此外,它不能找到像53811和12122436这样的数字,这正是我感兴趣的。如果有人能指导我正确方向或想出更简单有效的方法,我将非常感激。谢谢!
#include <stdio.h>

void check_two_num_sum(int,int);
void check_sum(int);
int flag = 0;

int main(){

int high,low;
printf("Enter higher range\n");
scanf("%d",&high);
printf("Enter lower range\n");
scanf("%d",&low);
check_two_num_sum(high,low);

return 0;
}

void check_two_num_sum(int high, int low)
{
  flag=0;
  for(low;low<high;low++)
  {
    check_sum(low);  
    if(flag==1)
    {
       printf("this value has additive sequence %d \n",low);
       flag = 0; 
     }
  }
}

void check_sum(int input)
{
   int count = 1;
   int capture, result, temp_res=0, n=0;

   if(n==0){
    result = input%10;
        n++;
        input = input/10;
        capture = input;
    }

   while(input!=0)
   {
     temp_res = temp_res + input%10;    

     if(count ==2)
      {
         if(result == temp_res)
          { 
         if(capture < 100)
        {       flag = 1;
                    break; 
        }

         else{
              check_sum(capture);
        }
           }

          else {
          break;
        }
        } 
    count++;
    input = input/10;
  }
}

你所链接的Career Cup网站上的第一个回答似乎是个不错的起点。你在代码中使用这个技巧了吗? - Abhishek Bansal
任何数字都可以被分解成加法序列,因为一个序列也可能只有一个或两个成员。例如,数字696可以被分解为:{6,9,6},这不是一个加法序列,但也可以被分解为{69,6}、{6,96}或{696},这些是加法序列。 - lkanab
@AbhishekBansal 我尝试了,但我不明白他所说的“T(1)和T(2)的数字不能大于最大范围的一半”的意思。 - Vbp
2个回答

1
我不确定它的效率会如何,但我可能会尝试递归。

例如,53811

指向字符串末尾,比如说。

Var2 = 1
Var1 = 1

检查 Var0 是否等于 Var2 - Var1

1 - 1 不等于 8,因此该函数段被终止。

在函数的下一个段中,Var2 等于最后两位数字,即 11Var1 = 8

检查 Var0 是否等于 Var2 - Var1

11 - 8 等于 3,因此该函数段继续执行:Var2 = 8Var1 = 3

检查 Var0 是否等于 Var2 - Var1

8 - 3 等于 5,这也是字符串的结尾,因此该函数返回 True

基本情况似乎是指针位于字符串开头或无法测试可行变量。在每个交汇点,Var2Var1将相应地更改以开始新的链; Var0由其他两个推导出来。

我非常喜欢你的想法,一定会尝试。谢谢 +1。 - Vbp
从末尾枚举和从开头枚举有什么区别? - jeffrey
@jeffrey 我还没有太多考虑这个选择;我只是选择了一个来尝试并且解决一个例子。 - גלעד ברקן

0
假设原序列的长度为n。一种显而易见的方法是枚举第一个和第二个元素的长度,并在线性时间内检查它是否正确。这种方法需要O(n ^ 3)的时间。
你声称你的方法只需要O(n)的时间,但从你的实现中,我怀疑你的n是否表示原序列的长度。

我明白你的意思,我已经删除了声称O(n)复杂度的说法。谢谢!@jeffrey - Vbp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接