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