【问题标题】:c++ calculate the sum of two array's and output a boolean '0' if result even else '1' if odd [closed]c ++计算两个数组的总和,如果结果偶数则输出布尔值'0',如果奇数则输出'1'[关闭]
【发布时间】:2021-11-06 10:33:29
【问题描述】:

我希望找到一个替代解决方案/方法来挖掘,以在给定参数的情况下解决上述问题。基本上我的方法是同时遍历两个数组并添加相应的值。首先是使用条件运算符。

#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

【问题讨论】:

  • 我认为您的代码似乎是巧合,但实际上是错误的。
  • 不管怎样,list3 在这个程序中从未被修改过,尽管要求它被填充。每个list3[i] 都可以替换为0。可能list3[i] == 本来是list3[i] =
  • 该算法存在:标准库std::transform
  • @GDube 你的教授正试图给你一个提示,我建议你阅读Two's complement
  • 就在for循环的开始处:list3[i]= (list1[i] + list2[i]) % 2; 然后,if 条件变为if(list[3] == 1)

标签: c++ arrays algorithm for-loop function-definition


【解决方案1】:
#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;
    }
}

【讨论】:

  • 我不熟悉transform的使用方法,@chris提到了,谢谢,我会继续练习的。
【解决方案2】:

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

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 语句中,使用逻辑 XOR 运算符代替表达式 ( a + b ) % 2 以避免整数溢出。

【讨论】:

    【解决方案3】:

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

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

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

    因此,如果 n &amp; 1m &amp; 1 相同 - n + m 是偶数。您可以使用XOR 运算符^ 进行检查:

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

    【讨论】:

      猜你喜欢
      • 2021-09-27
      • 2022-11-24
      • 2016-07-24
      • 2013-12-11
      • 1970-01-01
      • 2017-04-26
      • 1970-01-01
      • 2022-11-03
      • 2016-05-15
      相关资源
      最近更新 更多