Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 程序来检查我们是否能将数字求奇数和_C++_Sum - Fatal编程技术网

C++ 程序来检查我们是否能将数字求奇数和

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 如果我自己检查它,也就是

所以基本上这个程序需要几个测试用例,它们由一系列数字组成(长度为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
如果我自己检查它,也就是这一个测试用例,它会输出正确的“否”。 如果它与其他测试用例一起使用,也就是说它是测试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++,一般来说,编程。我还有很多要学习的。如果你解释为什么这是必要的,答案会更有用。长期解决办法是不要把所有的东西都放在代码>主< /代码>中,而不是。创建一个运行测试的函数。