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 & 1
与 m & 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
以避免整数溢出。
我希望找到一个 替代方案 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 & 1
与 m & 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
以避免整数溢出。