对数组中的奇数和偶数整数求和
Sum the odd positioned and the even positioned integers in an array
将'奇数位上的每个数'与'偶数位上的每个数乘以3'求和的最优雅的方法是什么?我必须遵守这个原型
int computeCheckSum(const int* d)
我的第一次尝试是使用这个,但我的想法是有缺陷的。我找不到一种方法来区分哪个元素是这样的
int sum=0;
for_each(d,
d+11,
[&sum](const int& i){sum+=(i%2==1)?3*i:i;}
);
例子1 2 3 4 5
1 + 2 * 3 + 3 + 4 * 3 + 5 = 27
我找不到一种方法来区分哪个元素是这样的
如果您坚持使用for_each
(这里没有理由这样做),那么您可以单独跟踪索引:
int computeCheckSum(const int* d, int count)
{
int sum=0;
int pos=1;
std::for_each(d, d+count,
[&sum,&pos](const int& value) { sum += pos++ % 2 ? value : value * 3; } );
return sum;
}
注意,我添加了一个count
参数,因此该函数可以处理任何长度的数组。如果你觉得很反常,你可以删除这个参数,然后重新硬编码长度,这样这个函数就只适用于有12个元素的数组。但如果你希望有一天能做得很好,那么这样做会让你觉得很恶心。
这些东西在c++中很少变得非常"优雅"(c++似乎在"行噪声"索引上逐渐接近Perl),但由于accumulate
是左折叠,您可以"沿着折叠"传递索引:
int sum = std::accumulate(d,
d + 11,
std::make_pair(0,0), // (index, result)
[](std::pair<int, int> r, int x) {
r.second += r.first % 2 ? x : 3 * x;
r.first++;
return r;
}).second;
你是对的。正如Mud所说,这只是一个糟糕的功能设计。这就是我需要的。
int computeCheckSum(){
int sum = 0;
bool multiplyBy3 = false;
for (auto i : m_digits){
sum += multiplyBy3 ? 3*i : i;
multiplyBy3 = !multiplyBy3;
}
return sum;
}
Mud的解决方案是正确的使用我有缺陷的设计。正如大家所说,一个简单的for循环可能是更好的解决方案。
相关文章:
- 如何反转整数参数包
- enum是C++中的宏变量还是整数变量
- 努力将整数转换为链表。不知道我在这里做错了什么
- 整数不会重复超过随机数
- 在C++中手动调整数组大小
- 检查输入是否不是整数或数字
- C++使用整数的压缩数组初始化对象
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 如何只允许用户输入正整数
- 如何在c++中从文本文件中逐行读取整数
- 向量值(字符串和整数)求和C++
- 使用192/256位整数求和无符号64位整数向量的点积的最快方法
- 如何在C++中对大数据整数进行加法、求和、乘法和除法运算
- C++对字符和整数求和
- 用于从包含最大求和的整数数组中提取子数组的算法
- 对字符串C++中的所有整数求和
- C++将字符串数组转换为整数,然后求和int数组
- 对数组中的奇数和偶数整数求和