找到组件

时间:2011-04-09 17:19:24

标签: c controls

所有。我正在创建一个可以找到整数

组件的简单函数

例如,如果我输入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

抱歉长篇大论,但是有人能给我一些提示吗?

谢谢你!

2 个答案:

答案 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,所以你可以查看我在说什么,尤其是简化循环。

希望这有帮助,

杰森