7
votes

Solution Port Ruby à C ++

Y a-t-il un moyen de le faire en C ++, en particulier la section de la plage.

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


7 commentaires

Les personnes qui peuvent répondre à cela sont probablement expérimentées des programmeurs C ++ et depuis ce groupe ne se chevauchent pas nécessairement avec des programmeurs rubis ... Que fait ce code?


@Etienne de Martel Il calcule la somme de tous les entiers dans la plage [0, 999] qui sont des multiples de 3 ou 5. L'approche "ennuyeuse" serait: int s = 0; pour (int i = 0; i <= 999; i ++) {if ((i% 3 == 0) || (i% 5 == 0)) {s + = i; }}; Cout << s; ou similaire.


L'approche "cool" serait d'utiliser des métaprogramming de modèle. Je suis sûr qu'il y a un moyen de le faire.


refroidisseur - ne pas se conformer à la norme mais atteint un résultat élégant et élégant. J'aime toujours essayer d'apprendre la manière standard et non standard (alternative) de faire des choses.


Vous pouvez probablement faire quelque chose avec le ACCUMULER algorithme et une fonction Lambda. Je suis venu avec une solution de python cool, cependant: somme (x pour x dans la plage (0, 1000) si x% 3 == 0 ou x% 5 == 0) .


Merci d'avoir fourni un exemple clair de pourquoi j'adore Ruby. :RÉ


@Dgm: Que diriez-vous de (0..999) .Sélectionnez {| A | A% 3 == 0 || A% 5 == 0} .Iject (: +) alors? :-)


4 Réponses :


2
votes

Le programme équivalent C ++ serait:

#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;
}


1 commentaires

Ouais, c'était fondamentalement ma solution de boucle aussi.



4
votes

code non testé. Utilise une fonctionnalité C ++ 0x (fonction Lambda et 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);


4 commentaires

Même plus de refroidisseur utiliserait générer pour peupler le vecteur.


Ou, puisque vous utilisez de toute façon C ++ 11 de toute façon, iota . De plus, vous avez besoin d'une effacement là-bas.


Il a également besoin v.end () dans l'appel Effacer et la logique Lambda est en arrière.


@FredLarson Que vouliez-vous dire par Lambda Logic?



9
votes

Solution de métaprogrammation de modèle:

Ce qui suit suppose que la limite inférieure de la plage est 0. p> xxx pré>

Ce qui suit vous permettra de spécifier une plage de chiffres (par exemple 0-999, 20-400). Je ne suis pas un maître de modèle métaprogramming, alors je ne pouvais pas penser à une solution plus propre (et je l'ai fait pour mes propres avantages et pratiques). P>

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;
}


0 commentaires

2
votes

Voici une version COOL C: xxx

http://codepad.org/euukfavkc


0 commentaires