C++ 程序来检查我们是否能将数字求奇数和
所以基本上这个程序需要几个测试用例,它们由一系列数字组成(长度为n)。我们应该看到,如果序列中至少存在一个长度x的组合,那么它们的和将是奇数。只要有一种这样的组合就足够了。如果可能,我们打印“是”,否则打印“否” 例如,如果我们输入 1(t=1,一个测试用例) 3 2(n=3,AKA 3总NRS,x=2,AKA考虑任何这些2) 16 11 12(这些是数字) 2个偶数,1个奇数。11+12为奇数,因此输出为是。 我的问题尤其是这种情况C++ 程序来检查我们是否能将数字求奇数和,c++,sum,C++,Sum,所以基本上这个程序需要几个测试用例,它们由一系列数字组成(长度为n)。我们应该看到,如果序列中至少存在一个长度x的组合,那么它们的和将是奇数。只要有一种这样的组合就足够了。如果可能,我们打印“是”,否则打印“否” 例如,如果我们输入 1(t=1,一个测试用例) 3 2(n=3,AKA 3总NRS,x=2,AKA考虑任何这些2) 16 11 12(这些是数字) 2个偶数,1个奇数。11+12为奇数,因此输出为是。 我的问题尤其是这种情况 3 3 101 102 103 如果我自己检查它,也就是
3 3
101 102 103
如果我自己检查它,也就是这一个测试用例,它会输出正确的“否”。
如果它与其他测试用例一起使用,也就是说它是测试2或更低版本,它将输出“Yes”
谁能告诉我为什么?
我会非常感激的
这是密码
#include <iostream>
using namespace std;
int main()
{
int t, n, x, k, c_even{ 0 }, c_odd{ 0 };
string v{"No\n"};
cin >> t;
//t is the number of total cases
for (int i = 1; i <= t; i++)
{
c_even = 0; //counter for even numbers
c_odd = 0; // counter for odd numbers
cin >> n >> x; // n is the total length of the sequence of nrs, x is how many numbers we consider out of the sequence
//this for loop is for introducing the sequence and counting how many nrs are odd and even
for (int j = 1; j <= n; j++)
{
cin >> k;
if (k % 2 == 0)
c_even++;
else c_odd++;
}
//obv if there are no odd nrs, sum won't ever be odd
if (c_odd == 0)
v = "No\n";
/*
for example, say we have 5 odd numbers, 3 even, and we have to consider 5 numbers out of total 8.
the for loop starts with 1. it checks if 1+3>=5, meaning if we have enough even nrs to make odd sum. it's not correct in this case.
then it goes to o=3; it checks if 3+3>=5. correct! so we have enough even nrs to make odd sum. other cases don't have to be considered.
*/
else for (int o = 1; o <= c_odd; o += 2)
{
if (o + c_even >=x)
{
v = "Yes\n";
break;
}
}
cout << v;
}
}
#包括
使用名称空间std;
int main()
{
int t,n,x,k,c_偶数{0},c_奇数{0};
字符串v{“No\n”};
cin>>t;
//t是总病例数
对于(int i=1;i> n>>x;//n是nRS序列的总长度,x是从序列中考虑多少个数。
//这个for循环用于引入序列并计算有多少NR是奇数和偶数
对于(int j=1;j>k;
如果(k%2==0)
c_偶数++;
else c_odd++;
}
//obv如果没有奇数NR,总和永远不会是奇数
如果(c_奇数==0)
v=“否\n”;
/*
例如,我们有5个奇数,3个偶数,我们必须从总数的8中考虑5个数字。
for循环从1开始。它检查1+3>=5,这意味着我们是否有足够的偶数NR来进行奇数和。在这种情况下是不正确的。
然后它转到o=3;它检查3+3>=5。正确!所以我们有足够的偶数NR来进行奇数和。其他情况不必考虑。
*/
用于(int o=1;o=x)的else
{
v=“是\n”;
打破
}
}
cout只需将字符串v{“No\n”};
移动到第一个for中。
如上所述,如果string v{“No\n”};
在第一个循环之外,那么在一次迭代将v设置为“Yes”而下一次迭代不满足
if (c_odd == 0)
v = "No\n";
换句话说,v保持“是”,程序将自动输出“是”,尽管它不是正确答案。
通过将该代码位移动到第一个for中,我们可以确保每次迭代都以v作为“No”开始。只需移动字符串v{“No\n”}
在最外层的循环中。否则,按照if else
的结构,您可能会意外地使用上一次迭代中的值。天哪,您是对的。我甚至都没有意识到。非常感谢!@davaisk这就是为什么您编写函数来进行测试,而不是将所有内容都粘在main
中。调用f做测试的功能消除了这些错误。@保罗·麦肯齐感谢你的建议。这是我的第二周C++,一般来说,编程。我还有很多要学习的。如果你解释为什么这是必要的,答案会更有用。长期解决办法是不要把所有的东西都放在代码>主< /代码>中,而不是。创建一个运行测试的函数。