Как убрать лишний вывод - PullRequest
       14

Как убрать лишний вывод

0 голосов
/ 20 сентября 2018

Моя проблема заключается в следующем: «Учитывая список чисел и число k, верните, складываются ли любые два числа из списка до k.

Например, учитывая [10, 15, 3, 7] и k из 17, верните истину, поскольку 10 + 7 равно 17. "

И написал этот код:

#include<iostream>
#include<iterator>

template<int N>

bool adding(int (&list)[N], int k) {

    //get size of array
    int length = (sizeof(list) / sizeof(list[0]));
    std::cout << k << std::endl;
    bool a = false;

    //init 2 pointer on array
    int *p1;
    p1 = &list[0];

    int *p2;
    p2 = &list[0];

    int sum = 0;

    int lengthNew = length;

    //check if p1+p2 = k
    for (int i = 0; i < length; i++) {

        for (int j = 0; j < lengthNew; j++) {
            sum = *p1 + *p2;

            if (p1 == p2) {
                p2++;
                j++;                
            }
            else if (sum == k) {
                std::cout << sum << " = " << k  << "\t*p1= " <<*p1<<"\t*p2= "<< *p2 << std::endl;
                a = true;
            }
            p2++;
        }
        p2 = p2 - length;
        p1++;

    }

    return a;

}

int main() {

    int myInts[] = { 19,1,2,18,13,4,10,5,5,12,7,10,8,16 };
    int k = 21;

    adding(myInts, k);

    int w;  
    std::cin >> w;

    return 0;

}

Я получаю этот вывод:

21 = 21 *p1= 19 *p2= 2
21 = 21 *p1= 2  *p2= 19

21 = 21 *p1= 13 *p2= 8

21 = 21 *p1= 5  *p2= 16
21 = 21 *p1= 5  *p2= 16

21 = 21 *p1= 8  *p2= 13

21 = 21 *p1= 16 *p2= 5
21 = 21 *p1= 16 *p2= 5

Как видите, всегда есть два равных выхода.Я знаю, что это потому, что я возвращаюсь к началу, но я не знаю, как это сделать иначе.Может ли кто-нибудь показать мне, как обойти избыточную информацию?Я думал, что смогу сохранить адреса выходов и сравнить, если эта комбинация уже используется.Но я думаю, что это не очень хорошее решение.

1 Ответ

0 голосов
/ 20 сентября 2018

Поскольку сложение является коммутативным, вам не нужно проходить весь массив для каждого элемента.
Достаточно проверить все элементы после элемента, который вы проверяете в настоящее время.

bool adding(const std::vector<int>& list, int k) {
    bool result = false;
    for (int i = 0; i < list.size(); i++) {
        for (int j = i + 1; j < list.size(); j++) {
            int sum = list[i] + list[j];
            if (sum == k) {
                std::cout << sum << " = " << k  << "\tn1= " <<list[i]<<"\tn2= "<< list[j] << std::endl;
                result = true;
            }
        }
    }
    return result;
}

Теперь каждая пара элементов будет сравниваться только один раз.

...