Soy nuevo en C ++. He encontrado el siguiente problema en una pregunta de Quora. ¿Cómo puedo resolverlo en C ++?

Su ejemplo de Python es incorrecto 🙂 Está multiplicando por num , no por i – y el range comienza desde 0 y no incluye el último número, por lo tanto, si configura num a 3, después de invertir imprimirá “¡Sonríe!” 2, 1 y 0 (es decir, solo nueva línea) veces (en lugar de 3, 2, 1).

Además, el uso de modo reversed anula por completo cualquier ventaja que pueda haber tenido al usar un iterador. Piénselo: los iteradores son geniales porque producen un elemento a la vez, siempre que sea necesario. Si los invierte, esto significa que su último elemento se necesita primero : no hay más remedio que “materializarlos” completamente en la memoria, porque ¿de qué otra manera sabrá qué elemento es el último?

Así que aquí está la versión revisada:

def printSmile(num):
for i in xrange(num, 0, -1):
print "Smile!" * i

Simplemente diga a xrange que comience desde num y termine en 0 (nuevamente, excluyendo 0) en el paso -1, es decir, hacia abajo.

Ahora, sobre C ++, aquí hay una solución simple:

#include
#include

usando el espacio de nombres estándar;

vacío printSmile (número int sin signo)
{
string s = “¡Sonríe!”;

for (unsigned int i = num; i> 0; i–) {
for (unsigned int j = 0; j <i; j ++) {
cout << s;
}
cout << endl;
}
}

int main (int argc, char * argv [])
{
printSmile (3);
}

También puede definir el operador “*” para cadenas y números, y usar eso:

#include
#include
#include // needed for operator*

usando el espacio de nombres estándar;

operador de cadena * (const string & s, unsigned int n)
{
cadena de flujo ret;

for (unsigned int i = 0; i <n; i ++) {
ret << s;
}

return ret.str ();
}

vacío printSmile (número int sin signo)
{
string s = “¡Sonríe!”;

for (unsigned int i = num; i> 0; i–) {
cout << s * i << endl;
}
}