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 }
4 Réponses :
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; }
Ouais, c'était fondamentalement ma solution de boucle aussi.
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);
Même plus de refroidisseur utiliserait générer code> 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 () code> dans l'appel code> Effacer code> et la logique Lambda est en arrière.
@FredLarson Que vouliez-vous dire par Lambda Logic?
Solution de métaprogrammation de modèle:
Ce qui suit suppose que la limite inférieure de la plage est 0. p> 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;
}
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; code> 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 code> 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) code>.
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 (: +) code> alors? :-)