将 ruby​​ 解决方案移植到 C++

发布于 2024-12-08 16:05:03 字数 206 浏览 0 评论 0原文

有没有办法在 C++ 中做到这一点,特别是范围部分。

answer = (0..999).select { |a| a%3 ==0 || a%5==0 }
puts answer.inject { |sum, n| sum+n }

我创建了自己的 C++ 解决方案,但使用了更标准的 for 循环,想知道是否有更酷的方法来实现它?

Is there any way to do this in C++ especially the range section.

answer = (0..999).select { |a| a%3 ==0 || a%5==0 }
puts answer.inject { |sum, n| sum+n }

I have created my own c++ solution but using a more standard for loop and wondered if there was a cooler way to do it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

眼中杀气 2024-12-15 16:05:03

模板元编程解决方案:

以下假设范围的下限为 0。

template <int N>
struct sum
{
  static const int value = sum<N-1>::value + (N % 3 == 0 || N % 5 == 0 ? N : 0);
};

template <>
struct sum<0>
{
  static const int value = 0;
};

int main(int argc, char** argv)
{
  int n = sum<999>::value;
  return 0;
}

以下将允许您指定数字范围(例如 0-999、20-400)。我不是模板元编程的大师,所以我想不出更干净的解决方案(我这样做是为了我自己的利益和实践)。

template <int N, int Upper, bool IsLast>
struct sum_range_helper
{
  static const int value = (N % 3 == 0 || N % 5 == 0 ? N : 0) + sum_range_helper<N + 1, Upper, N + 1 == Upper>::value;
};

template <int N, int Upper>
struct sum_range_helper<N, Upper, true>
{
  static const int value = (N % 3 == 0 || N % 5 == 0 ? N : 0);
};

template <int Lower, int Upper>
struct sum_range
{
  static const int value = sum_range_helper<Lower, Upper, Lower == Upper>::value;
};

int main(int argc, char** argv)
{
  int n = sum_range<0, 999>::value;
  return 0;
}

Template metaprogramming solution:

The following assumes the lower bound of the range is 0.

template <int N>
struct sum
{
  static const int value = sum<N-1>::value + (N % 3 == 0 || N % 5 == 0 ? N : 0);
};

template <>
struct sum<0>
{
  static const int value = 0;
};

int main(int argc, char** argv)
{
  int n = sum<999>::value;
  return 0;
}

The following will allow you to specify a range of numbers (e.g. 0-999, 20-400). I'm not a master of template metaprogramming so I couldn't think of a cleaner solution (and I did this for my own benefit and practice).

template <int N, int Upper, bool IsLast>
struct sum_range_helper
{
  static const int value = (N % 3 == 0 || N % 5 == 0 ? N : 0) + sum_range_helper<N + 1, Upper, N + 1 == Upper>::value;
};

template <int N, int Upper>
struct sum_range_helper<N, Upper, true>
{
  static const int value = (N % 3 == 0 || N % 5 == 0 ? N : 0);
};

template <int Lower, int Upper>
struct sum_range
{
  static const int value = sum_range_helper<Lower, Upper, Lower == Upper>::value;
};

int main(int argc, char** argv)
{
  int n = sum_range<0, 999>::value;
  return 0;
}
戏剧牡丹亭 2024-12-15 16:05:03

未经测试的代码。使用 C++ 0x 功能(lambda 函数和 iota)

vector<int> v(1000);

//fill the vector
iota(v.begin(),v.end(),0);

v.erase(remove_if(v.begin(),v.end(),[](int a) { return !(a%3 && a%5); }),v.end());
int sum = accumulate(v.begin(),v.end(),0);

Untested code. Uses C++ 0x feature (lambda function and iota)

vector<int> v(1000);

//fill the vector
iota(v.begin(),v.end(),0);

v.erase(remove_if(v.begin(),v.end(),[](int a) { return !(a%3 && a%5); }),v.end());
int sum = accumulate(v.begin(),v.end(),0);
愁杀 2024-12-15 16:05:03

等效的 C++ 程序是:

#include <iostream>
using namespace std;

int main() {
  int sum = 0;
  for (int i=0; i <= 999; i++) {
    if (i%3 == 0 || i%5 == 0)
      sum += i;
  }
  cout << sum;
  return 0;
}

The equivalent C++ program would be:

#include <iostream>
using namespace std;

int main() {
  int sum = 0;
  for (int i=0; i <= 999; i++) {
    if (i%3 == 0 || i%5 == 0)
      sum += i;
  }
  cout << sum;
  return 0;
}
醉城メ夜风 2024-12-15 16:05:03

这是一个很酷的 C 版本:

#include <stdio.h>

#define LAMBDA(body, ...) ({ int _(__VA_ARGS__) { return (body); }; _; })

int range(int* arr, int start, int end) {
    (*arr = start) < end && range(arr + 1, start + 1, end);
}

void select(int* arr, int count, int(*fn)(int)) {
    int i;
    for(i = 0; i < count; i++)
        if(!fn(arr[i]))
            arr[i] = 0;
}

int inject(int* arr, int count, int(*fn)(int,int)) {
    int acc = arr[0], i;
    for(i = 1; i < count; i++)
        acc = fn(acc, arr[i]);
    return acc;
}

int main()
{
    int numbers[1000];

    range(numbers, 1, 1000);
    select(numbers, 1000, LAMBDA(a % 3 == 0 || a % 5 == 0, a));
    printf("%d\n", inject(numbers, 1000, LAMBDA(a + b, a, b)));
}

http://codepad.org/eUKFAvkc

Here's a cool C version:

#include <stdio.h>

#define LAMBDA(body, ...) ({ int _(__VA_ARGS__) { return (body); }; _; })

int range(int* arr, int start, int end) {
    (*arr = start) < end && range(arr + 1, start + 1, end);
}

void select(int* arr, int count, int(*fn)(int)) {
    int i;
    for(i = 0; i < count; i++)
        if(!fn(arr[i]))
            arr[i] = 0;
}

int inject(int* arr, int count, int(*fn)(int,int)) {
    int acc = arr[0], i;
    for(i = 1; i < count; i++)
        acc = fn(acc, arr[i]);
    return acc;
}

int main()
{
    int numbers[1000];

    range(numbers, 1, 1000);
    select(numbers, 1000, LAMBDA(a % 3 == 0 || a % 5 == 0, a));
    printf("%d\n", inject(numbers, 1000, LAMBDA(a + b, a, b)));
}

http://codepad.org/eUKFAvkc

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文