从 C++ 的数组代码中调试我的三元组总和的错误
Debug errors from my triplet sum from an array code from C++
我正在尝试一个 codingninjas 问题,执行时只满足了 1 个测试用例,请帮忙。
给定一个随机整数数组和一个数字 x。查找并打印数组中总和为 x 的元素的三元组。
打印三元组时,先打印最小的元素。
也就是说,如果有效的三元组是 (6, 5, 10),则输出“5 6 10”。没有限制必须在第一行打印 5 个三元组。您可以按任何顺序打印三元组,请注意三元组中元素的顺序。
示例输入
7
1 2 3 4 5 6 7
12
示例输出
1 4 7
1 5 6
2 3 7
2 4 6
3 4 5
这是我的代码
#include<iostream>
using namespace std;
void FindTriplet(int arr[], int n, int sum)
{
for (int i = 0; i<n-2; i++)
{
for (int j = i+1; j < n -1; j++)
{
for (int k = j+1; k < n; k++)
{
if (arr[i] + arr[j] + arr[k] == sum)
{
if(arr[i]<arr[j] && arr[i]<arr[k])
{
if(arr[j]<arr[k])
cout << arr[i] << " "<< arr[j] << " " << arr[k] <<endl;
else
cout << arr[i] << " "<< arr[k] << " " << arr[j] <<endl;
}
else if(arr[j]<arr[i] && arr[j]<arr[k])
{
if(arr[i]<arr[k])
cout << arr[j] << " "<< arr[i] << " " << arr[k] <<endl;
else
cout << arr[j] << " "<< arr[k] << " " << arr[i] <<endl;
}
else
{
if(arr[i]<arr[j])
cout << arr[k] << " "<< arr[i] << " " << arr[j] <<endl;
else
cout << arr[k] << " "<< arr[j] << " " << arr[i] <<endl;
}
}
}
}
}
}
int main()
{
int size;
int x;
cin>>size;
int *input=new int[1+size];
for(int i=0;i<size;i++)
cin>>input[i];
cin>>x;
FindTriplet(input,size,x);
return 0;
}
如果三元组在 i-th 和 j-th 位置由 2 个相等的数字组成,并且 arr[k] > arr[i]
会怎样?例如 (1, 1, 2)
与所需的总和 4
?
表达式 arr[i]<arr[j] && arr[i]<arr[k]
为假。 arr[j]<arr[i] && arr[j]<arr[k]
也是如此。所以你落入了else
分支(arr[k]<arr[i] && arr[k]<arr[j]
),而事实并非如此。
逻辑错误。
我将 < 替换为 <= 以使代码也能够比较相等的数字。
正确的代码是-
#include<iostream>
using namespace std;
void FindTriplet(int arr[], int n, int sum)
{
for (int i = 0; i<n-2; i++)
{
for (int j = i+1; j < n -1; j++)
{
for (int k = j+1; k < n; k++)
{
if (arr[i] + arr[j] + arr[k] == sum)
{
if(arr[i]<=arr[j] && arr[i]<=arr[k])
{
if(arr[j]<=arr[k])
cout << arr[i] << " "<< arr[j] << " " << arr[k] <<endl;
else
cout << arr[i] << " "<< arr[k] << " " << arr[j] <<endl;
}
else if(arr[j]<=arr[i] && arr[j]<=arr[k])
{
if(arr[i]<=arr[k])
cout << arr[j] << " "<< arr[i] << " " << arr[k] <<endl;
else
cout << arr[j] << " "<< arr[k] << " " << arr[i] <<endl;
}
else
{
if(arr[i]<=arr[j])
cout << arr[k] << " "<< arr[i] << " " << arr[j] <<endl;
else
cout << arr[k] << " "<< arr[j] << " " << arr[i] <<endl;
}
}
}
}
}
}
int main()
{
int size;
int x;
cin>>size;
int *input=new int[1+size];
for(int i=0;i<size;i++)
cin>>input[i];
cin>>x;
FindTriplet(input,size,x);
return 0;
}
感谢所有帮助过我的人。
我正在尝试一个 codingninjas 问题,执行时只满足了 1 个测试用例,请帮忙。
给定一个随机整数数组和一个数字 x。查找并打印数组中总和为 x 的元素的三元组。
打印三元组时,先打印最小的元素。
也就是说,如果有效的三元组是 (6, 5, 10),则输出“5 6 10”。没有限制必须在第一行打印 5 个三元组。您可以按任何顺序打印三元组,请注意三元组中元素的顺序。
示例输入
7
1 2 3 4 5 6 7
12
示例输出
1 4 7
1 5 6
2 3 7
2 4 6
3 4 5
这是我的代码
#include<iostream>
using namespace std;
void FindTriplet(int arr[], int n, int sum)
{
for (int i = 0; i<n-2; i++)
{
for (int j = i+1; j < n -1; j++)
{
for (int k = j+1; k < n; k++)
{
if (arr[i] + arr[j] + arr[k] == sum)
{
if(arr[i]<arr[j] && arr[i]<arr[k])
{
if(arr[j]<arr[k])
cout << arr[i] << " "<< arr[j] << " " << arr[k] <<endl;
else
cout << arr[i] << " "<< arr[k] << " " << arr[j] <<endl;
}
else if(arr[j]<arr[i] && arr[j]<arr[k])
{
if(arr[i]<arr[k])
cout << arr[j] << " "<< arr[i] << " " << arr[k] <<endl;
else
cout << arr[j] << " "<< arr[k] << " " << arr[i] <<endl;
}
else
{
if(arr[i]<arr[j])
cout << arr[k] << " "<< arr[i] << " " << arr[j] <<endl;
else
cout << arr[k] << " "<< arr[j] << " " << arr[i] <<endl;
}
}
}
}
}
}
int main()
{
int size;
int x;
cin>>size;
int *input=new int[1+size];
for(int i=0;i<size;i++)
cin>>input[i];
cin>>x;
FindTriplet(input,size,x);
return 0;
}
如果三元组在 i-th 和 j-th 位置由 2 个相等的数字组成,并且 arr[k] > arr[i]
会怎样?例如 (1, 1, 2)
与所需的总和 4
?
表达式 arr[i]<arr[j] && arr[i]<arr[k]
为假。 arr[j]<arr[i] && arr[j]<arr[k]
也是如此。所以你落入了else
分支(arr[k]<arr[i] && arr[k]<arr[j]
),而事实并非如此。
逻辑错误。
我将 < 替换为 <= 以使代码也能够比较相等的数字。
正确的代码是-
#include<iostream>
using namespace std;
void FindTriplet(int arr[], int n, int sum)
{
for (int i = 0; i<n-2; i++)
{
for (int j = i+1; j < n -1; j++)
{
for (int k = j+1; k < n; k++)
{
if (arr[i] + arr[j] + arr[k] == sum)
{
if(arr[i]<=arr[j] && arr[i]<=arr[k])
{
if(arr[j]<=arr[k])
cout << arr[i] << " "<< arr[j] << " " << arr[k] <<endl;
else
cout << arr[i] << " "<< arr[k] << " " << arr[j] <<endl;
}
else if(arr[j]<=arr[i] && arr[j]<=arr[k])
{
if(arr[i]<=arr[k])
cout << arr[j] << " "<< arr[i] << " " << arr[k] <<endl;
else
cout << arr[j] << " "<< arr[k] << " " << arr[i] <<endl;
}
else
{
if(arr[i]<=arr[j])
cout << arr[k] << " "<< arr[i] << " " << arr[j] <<endl;
else
cout << arr[k] << " "<< arr[j] << " " << arr[i] <<endl;
}
}
}
}
}
}
int main()
{
int size;
int x;
cin>>size;
int *input=new int[1+size];
for(int i=0;i<size;i++)
cin>>input[i];
cin>>x;
FindTriplet(input,size,x);
return 0;
}
感谢所有帮助过我的人。