c ++计算两个数组的总和,如果结果为偶数,则输出布尔值“0”,如果结果为奇数,则输出“1”

c++ calculate the sum of two array's and output a boolean '0' if result even else '1' if odd

我希望找到一个 替代方案 solution/method 来解决给定参数的上述问题。本质上,我采用的方法是同时循环遍历两个数组并添加相应的值。首先是使用条件运算符。

#include <iostream>
#include <array>

using namespace std;

//an array of size 0 [no elements]
void myLists(int list1[], int list2[], int list3[], int size)
{
    for (int i = 0; i < size; i++)
    {
        if ((list1[i] + list2[i]) % 2 == 0) // return the modulo of the two array sums
        {
            cout << (list3[i] == true);
        }
        else
        {
            cout << (list3[i] == false);
        };
    }
}
int main()
{
    //initialize the two arrays
    int list1[5]{1, 2, 3, 4, 5};
    int list2[5]{0, 4, 6, 8, 10};
    int list3[5]{};
    int size{};

    size = sizeof(list1) / sizeof(list1[0]);

    myLists(list1, list2, list3, size);

    return 0;
}

代码结果:

10101

#include <algorithm>
#include <iostream>

void myList(int list1[], int list2[], int list3[], int size) {
    std::transform(
            list1, list1 + size,
            list2,
            list3,
            [](int elem1, int elem2) { return (elem1 + elem2) % 2; }
        );
}
int main() {
    int list1[5]{1, 2, 3, 4, 5};
    int list2[5]{0, 4, 6, 8, 10};
    int list3[5]{};
    int size = sizeof(list1) / sizeof(list1[0]);

    myList(list1, list2, list3, size);
    for (auto elem : list3) {
        std::cout << elem;
    }
    putchar('\n');
}

或者如果你想要原始循环:

void myList(int list1[], int list2[], int list3[], int size) {
    for (int i = 0; i < size; i++) {
        list3[i] = (list1[i] + list2[i]) % 2;
    }
}

您不必实际将两个整数相加来查看它们的和是偶数还是奇数。

你知道,具有相同“奇数”的数字将相加为偶数,而具有不同“-”的数字将相加为奇数。

%2 的替代方法是最后一位的按位 &;如果 n & 1 为真,则 n 为奇数。

所以如果 n & 1m & 1 相同 - n + m 是偶数。您可以使用 XOR 运算符 ^:

检查
list3[i] = (list1[i] & 1) ^ (list2[i] & 1);

对于初学者来说,函数应该这样声明

void myLists( const int list1[], const int list2[], int list3[], size_t size ;

因为第一个参数和第二个参数都没有在函数内更改。

函数不设置第三个数组的元素。由于第三个数组是零初始化的

int list3[5]{};

那么这个表达式 list3[i] == true 总是计算为 false 而这个表达式 list3[i] == false 总是计算为 true.

事实上你可以这样写

if ((list1[i] + list2[i]) % 2 == 0) // return the modulo of the two array sums
{
    list3[i] = list3[i] == true;
}
else
{
    list3[i] = list3[i] == false;
};

list3[i] = (list1[i] + list2[i]) % 2 == 0 ? list3[i] == true : list3[i] == false;

但这看起来很笨拙,而且 一般来说,这种方法是不正确的,并且会导致未定义的行为,因为用户可以将未初始化的数组作为第三个参数传递。

写成

就更好更正确了
list3[i] = ( list1[i] + list2[i] ) % 2;

另一种方法是使用标准算法 std::transform

这是一个演示程序。

#include <iostream>
#include <algorithm>

void myLists( const int list1[], const int list2[], int list3[], size_t size )
{
    std::transform( list1, list1 + size, list2, list3,
                    [] ( const auto &a, const auto &b )
                    {
                        return a % 2 ^ b % 2;
                    });
}

int main() 
{
    const size_t size = 5; 
    int list1[size] = { 1, 2, 3, 4, 5 };
    int list2[size] = { 0, 4, 6, 8, 10 };
    int list3[size];
    
    myLists( list1, list2, list3, size );
    
    for ( const auto &item : list3 )
    {
        std::cout << item << ' ';
    }
    
    std::cout << '\n';
    
    return 0;
}

程序输出为

1 0 1 0 1

在 lambda 表达式的 return 语句中,使用了逻辑异或运算符而不是表达式 ( a + b ) % 2 以避免整数溢出。