所有。我正在创建一个可以找到整数
组件的简单函数例如,如果我输入4 6 4 3 2 2 1 1,
意味着我必须从
中找到数字'4'(第1个)的组成部分随后的6(第二)元素4,3,2,2,1,1
所以预期的输出就像 4 3 + 1 2 + 2 2 + 1 + 1
当您找不到任何组件时,请打印NONE。
我的功能如下:
int Addition(int command[], int target, int length ){
/* command : the input line
length : the amount of elements need to be checked */
int i = 0, j = 1, k = 0;
int sum = command[0];
int content[length];
content[0] = command[0];
while(j <= length){
if(sum == target){
for(i = 0; i < k; ++i){
printf("%d+", content[i]);
}
printf("%d\n", content[i]);
sum = command[0];
k = 0;
++counter;
}
sum += command[j];
if(sum > target){
sum -= command[j];
}else{
++k;
content[k] = command[j];
}
++j;
}
if( length == 0 && counter == 0 )
printf("NONE\n");
else{
return Addition(command+1, target, length-1);
}
}
我的问题是我不知道如何设置条件
在没有组件时打印NONE,我无法避免
打印相同的答案。我的输出如下:
4的总和: 4 4 4 4 4 4 4 3 + 1 3 + 1 2 + 2 2 + 1 + 1 2 + 1 + 1 NONE
抱歉长篇大论,但是有人能给我一些提示吗? 谢谢你!答案 0 :(得分:1)
将程序分为两个阶段。第一阶段只找到解决方案而不打印它们;相反,它以某种方式存储它们(我可以想到至少三个)。第二阶段删除重复项,然后打印已删除的列表,如果没有,则打印NONE
。
答案 1 :(得分:0)
由于这是一个递归函数,你应该进行测试以确保length != 0
正好在函数的开头,这样你就不会循环整个循环,访问不应该的内存被访问(因为此时command
指向内存段的末尾,您将完成从sum
所指向的值中分配command
的值的操作至)。
其次,我没有看到为什么你的函数需要返回类型int
。似乎void
可以很好地工作,因为你没有从函数返回任何东西(即,如果你最后只是打印“NONE”并返回没有任何返回值,所以有不需要返回类型为int
...它应该是void
)。
所以,既然你没有返回任何内容(即void
),那么在你做其他任何事情之前你的函数的第一行应该是这样的:
if (length == 0)
{
printf("NONE\n");
return;
}
通过这种方式,您可以捕获需要停止递归调用的位置。那么函数的最后一行可以是(你可以在递归函数调用之前省略“return”,因为你要返回void
):
Addition(command+1, target, length-1);
最后,我相信您正在打印所有这些重复值,因为您正在通过command
数组递增错误(看起来过于复杂)。您应该只需要一个for循环或while循环,其中您将command
中的第一个变量与其余值匹配,并检查它们的总和是否等于目标。
我made a working copy of your function over at ideone,所以你可以查看我在说什么,尤其是简化循环。
希望这有帮助,
杰森