C/C++でif,while,switch,forを使わずに1から1000までの素数を求めるプログラムを書く。
結局私も友達もできなかったのですが....
因みに私は関数のポインタ等をバンバン使って仕方なくgotoも使ってやろうとしました。
で、こんなトピックをたてたら面白いかなーと思いたてて見ました。
皆さん挑戦してくださいm(_ _)m
#include <stdio.h>
const char* format="%d\n";
int main(void) {
asm volatile (
"pushl %ebp\n\t"
"movl %esp,%ebp\n\t"
"pushl %esi\n\t"
"pushl %ebx\n\t"
"movl $1,%ebx\n\t"
"L15:\n\t"
"cmpl $1,%ebx\n\t"
"movl $2,%ecx\n\t"
"setg %dl\n\t"
"andl $255,%edx\n\t"
"cmpl %ebx,%ecx\n\t"
"movl %edx,%esi\n\t"
"jge L9\n\t"
"L13:\n\t"
"movl %ebx,%edx\n\t"
"movl %ebx,%eax\n\t"
"sarl $31,%edx\n\t"
"idivl %ecx\n\t"
"testl %edx,%edx\n\t"
"je L19\n\t"
"incl %ecx\n\t"
"cmpl %ebx,%ecx\n\t"
"jl L13\n\t"
"L9:\n\t"
"testl %esi,%esi\n\t"
"jne L20\n\t"
"L6:\n\t"
"incl %ebx\n\t"
"cmpl $999,%ebx\n\t"
"jle L15\n\t"
"leal -8(%ebp),%esp\n\t"
"popl %ebx\n\t"
"popl %esi\n\t"
"popl %ebp\n\t"
"jmp L21\n\t"
"L20:\n\t"
"pushl %eax\n\t"
"pushl %eax\n\t"
"pushl %ebx\n\t"
"pushl _format\n\t"
"call _printf\n\t"
"addl $16,%esp\n\t"
"jmp L6\n\t"
"L19:\n\t"
"xorl %esi,%esi\n\t"
"jmp L9\n\t"
"L21:\n\t"
);
return 0;
}
object Main
{
def isPrime(n : Int) : Boolean = n >= 2 && (2 to n).count(n % _ == 0) == 1
def main(args : Array[String]) : Unit = (2 to 1000).filter(isPrime).foreach(println);
}
#include <cstdio>
#include <algorithm>
int slist[1000];
int suuti_gen(void) {
static int suuti=1;
return suuti++;
}
class sosuu_hantei {
private:
int number;
int ok;
public:
sosuu_hantei(int num) : number(num) , ok(1) {}
void operator() (int x) {ok=ok && (number%x);}
int get_result() {return ok && (number>1);}
};
class sosuu_print {
public:
sosuu_print() {}
void operator() (int x) {
sosuu_hantei sh=x>1?std::for_each(
slist+1,slist+x-1,sosuu_hantei(x)):sosuu_hantei(1);
sh.get_result()&&printf("%d\n",x);
}
};
int main(void) {
std::generate(slist,slist+1000,suuti_gen);
std::for_each(slist,slist+1000,sosuu_print());
return 0;
}
(゚д゚)!僕は投稿してませんよ。pefs3d さんが書きました: >>beatleさん
bitter_foxです、よろしくお願いします。pefs3d さんが書きました:>>beatleさん
率直な感想は「み、短い..」ですね。
ただ、Scalaもアセンブリ同様さっぱりです..
C/C++は短いものは短いですが、長いものは極端にコードが長くなるイメージがあります。