C 加法序列算法

C 加法序列算法,c,algorithm,numbers,logic,sequences,C,Algorithm,Numbers,Logic,Sequences,我正在练习面试的算法,在和的时候遇到了这个问题 加法序列号是指当拆分为两种不同的数字形式加法序列号 Ex:1235(拆分为1,2,3,5) Ex:12122436(拆分为12,12,24,36) 给定一个范围,是否查找所有加法序号 下面是我尝试过的,我知道它效率不高,也不确定它的复杂性。此外,它没有找到像53811和12122436这样的数字,我对此感兴趣。如果有人能给我指引正确的方向,或者想出更简单有效的方法,我会非常感激。谢谢 #include <stdio.h> void c

我正在练习面试的算法,在和的时候遇到了这个问题 加法序列号是指当拆分为两种不同的数字形式加法序列号

Ex:1235(拆分为1,2,3,5)
Ex: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;
  }
}
#包括
无效检查两个数值之和(int,int);
无效支票金额(整数);
int标志=0;
int main(){
int高,低;
printf(“输入更高的范围\n”);
扫描频率(“%d”和“高”);
printf(“输入下限\n”);
扫描频率(“%d”和“低”);
检查两个数字和(高、低);
返回0;
}
无效检查两个数值总和(整数高,整数低)
{
flag=0;

对于(low;low假设原始序列的长度为n。一种明显可行的方法是强行枚举第一个和第二个元素的长度,并检查其在线性时间内是否正确。这种方法需要
O(n^3)
时间


您声称您的方法需要
O(n)
时间,但从您的实现来看,我怀疑您的
n
是否表示原始序列的长度。

我不确定它的效率有多高,但我可能会尝试递归的方法

例如,
53811

指向字符串的末尾,例如

Var2 = 1
Var1 = 1
检查
Var0
是否等于
Var2-Var1

1-1
不等于
8
,因此该函数链终止

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

检查
Var0
是否等于
Var2-Var1

11-8
等于
3
,因此此函数串继续:
Var2=8
Var1=3

检查
Var0
是否等于
Var2-Var1

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



基本情况似乎是指针位于字符串的开头,或者无法测试任何可行的变量。在每个连接点,
Var2
Var1
将相应地改变,以开始新的串;
Var0
是从其他两个串中推导出来的。

你链接的职业杯网站上的第一个答案似乎是一个很好的起点。您在代码中使用了这个技巧吗?任何数字都可以拆分为加法seq,因为序列也可能有一个或两个成员。例如,数字696可以拆分为:{6,9,6},它不是加法seq,但也可以拆分为{69,6}或{6,96}或{696}这是令人上瘾的序列。@AbhishekBansal我试过了,但我不明白他所说的“T(1)和T(2)的数字不能超过最大范围的一半”是什么意思我真的很喜欢你的想法,并且一定会尝试一下。谢谢+1。从结尾开始列举与从开头列举有什么区别?@jeffrey我没有过多考虑这个选择;我只是选择了一个来尝试并制作一个例子。我明白你的意思,我删除了O(n)复杂性的说法。谢谢!@jeffrey