如何删除冗余输出

时间:2018-09-20 12:49:45

标签: c++ arrays pointers sum compare

我的问题是这样的: “给出一个数字列表和一个数字k,返回列表中是否有两个数字加起来等于k。

例如,给定[10,15,3,7]且k为17,因为10 + 7为17,所以返回true。“

并编写以下代码:

#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

如您所见,总是有两个相等的输出。我知道这是因为我将p2设置回了开始,但是不知道该怎么做。有人可以告诉我如何绕过多余的信息吗?我认为我可以保存输出的地址并比较是否已经使用了此组合。但是我认为这不是一个好的解决方案。

1 个答案:

答案 0 :(得分:4)

因为加法是可交换的,所以不必为每个元素遍历整个数组。
只需在您当前要检查的元素之后 检查所有元素即可。

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;
}

每对元素现在只进行一次比较。