Imprimiendo del 1 al 1000 sin bucle ni condicionales

Resuelto asked hace 13 años • 106 respuestas

Tarea : Imprima números del 1 al 1000 sin utilizar ningún bucle ni declaraciones condicionales. No escriba simplemente la declaración printf()o cout1000 veces.

¿Cómo harías eso usando C o C++?

 avatar Dec 31 '10 13:12
Aceptado

Este en realidad se compila en un ensamblador que no tiene ningún condicional:

#include <stdio.h>
#include <stdlib.h>

void main(int j) {
  printf("%d\n", j);
  (&main + (&exit - &main)*(j/1000))(j+1);
}


Editar: se agregó '&' para que considere la dirección y evite los errores del puntero.

Esta versión de lo anterior en C estándar, ya que no depende de la aritmética en los punteros de función:

#include <stdio.h>
#include <stdlib.h>

void f(int j)
{
    static void (*const ft[2])(int) = { f, exit };

    printf("%d\n", j);
    ft[j/1000](j + 1);
}

int main(int argc, char *argv[])
{
    f(1);
}
Bill avatar Jan 03 '2011 09:01 Bill

¡Recursión en tiempo de compilación! :PAG

#include <iostream>
template<int N>
struct NumberGeneration{
  static void out(std::ostream& os)
  {
    NumberGeneration<N-1>::out(os);
    os << N << std::endl;
  }
};
template<>
struct NumberGeneration<1>{
  static void out(std::ostream& os)
  {
    os << 1 << std::endl;
  }
};
int main(){
   NumberGeneration<1000>::out(std::cout);
}
 avatar Dec 31 '2010 06:12
#include <stdio.h>
int i = 0;
p()    { printf("%d\n", ++i); }
a()    { p();p();p();p();p(); }
b()    { a();a();a();a();a(); }
c()    { b();b();b();b();b(); }
main() { c();c();c();c();c();c();c();c(); return 0; }

Me sorprende que nadie parezca haber publicado esto; pensé que era la forma más obvia.1000 = 5*5*5*8.

Darius Bacon avatar Jan 03 '2011 02:01 Darius Bacon