Моя проблема заключается в следующем: «Учитывая список чисел и число 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
Как видите, всегда есть два равных выхода.Я знаю, что это потому, что я возвращаюсь к началу, но я не знаю, как это сделать иначе.Может ли кто-нибудь показать мне, как обойти избыточную информацию?Я думал, что смогу сохранить адреса выходов и сравнить, если эта комбинация уже используется.Но я думаю, что это не очень хорошее решение.