найти компоненты - PullRequest
       1

найти компоненты

1 голос
/ 09 апреля 2011

все. Я делаю простую функцию, которая может найти компоненты целого числа

например, если я введу 4 6 4 3 2 2 1 1,

означает, что мне нужно найти компоненты числа '4' (1-е) из

следующих 6 (2) элементов 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 ОТСУТСТВУЕТ

извините за длинное описание, но может ли кто-нибудь дать мне подсказку о моих проблемах?

спасибо!

Ответы [ 2 ]

1 голос
/ 09 апреля 2011

Разделите программу на две фазы. Первая фаза только находит решения и не печатает их; вместо этого он каким-то образом прячет их (я могу придумать как минимум три). На втором этапе удаляются дубликаты, а затем распечатывается дедуплицированный список, или NONE, если таковых не было.

0 голосов
/ 09 апреля 2011

Так как это рекурсивная функция, вы должны поместить тест, чтобы убедиться, что length != 0 в самом начале функции, чтобы вы не циклически проходили весь цикл, обращаясь к памяти, к которой не следует обращаться(потому что в этот момент command указывает на конец сегмента памяти, и вы бы выполнили такие операции, как присвоение значения sum из значения того, на что указывает command).

Во-вторых, я нигде не вижу, почему ваша функция должна иметь тип возврата int.Кажется, что void будет работать отлично, так как вы ничего не возвращаете из функции (то есть, если вы в конце, вы просто печатаете «NONE» и возвращаете без какого-либо возвращаемого значения, так что в этом нет необходимости).чтобы тип возвращаемого значения был int ... он должен быть void).

Итак, поскольку вы ничего не возвращаете (т.е. void), первая строка в вашей функции передВы делаете все остальное, должно выглядеть примерно так:

if (length == 0)
{
    printf("NONE\n");
    return;
}

Таким образом, вы ловите, где вам нужно остановить рекурсивные вызовы.Тогда последняя строка вашей функции может быть (вы можете опустить «возврат» перед рекурсивным вызовом функции, так как вы возвращаете void):

Addition(command+1, target, length-1); 

Наконец, я полагаю, что вы печатаете всеэти повторяющиеся значения, потому что вы неправильно увеличиваете массив command (он кажется слишком сложным).Вам просто необходим один цикл for или while, где вы сопоставляете первую переменную в command с остальными значениями и проверяете, соответствуют ли их суммы цели.

I'm Я сделал рабочую копию вашей функции на ideone , чтобы вы могли проверить, о чем я говорю, особенно об упрощении цикла.

Надеюсь, это поможет,

Джейсон

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...