ぐいぐい01アプリ 3桁までの素数を計算
ぐいぐい01アプリを作ってみました。エラトステネスの篩で3桁までの素数を計算しています。
/* primoj.c */ #include <guigui01.h> void setdec(char *s, int i, int n) { int j; for (j = n - 1; j >= 0; j--) { s[j] = '0' + (i % 10); i /= 10; } for (j = 0; j < n - 1; j++) { if (s[j] != '0') break; s[j] = ' '; } return; } void G01Main() { int i, j; long p[16]; char s[7]; for(i = 0; i < 16; i++) { p[i] = 0x0000; } s[3] = ' '; s[4] = 0; g01_putstr0(" 2 "); for(i = 3; i <= 173; i += 2) { if( (p[(i-3)/2 / 32] & (0x0001 << ((i-3)/2 % 32))) == 0 ) { for(j = i*3; j <= 999; j += i*2) { p[(j-3)/2 / 32] |= 0x0001 << ((j-3)/2 % 32); } setdec(s, i, 3); g01_putstr0(s); } } for(; i <= 999; i += 2) { if( (p[(i-3)/2 / 32] & (0x0001 << ((i-3)/2 % 32))) == 0 ) { setdec(s, i, 3); g01_putstr0(s); } } return; }
冗長な部分もありますが、これをコンパイル・圧縮すると329バイトのprimoj.g01ができました。(うちのツールキットはまだ最新版のabcdw014に対応させていないので、それで作るのとはサイズが違うと思います。)
Windows版のprimes.exeも作りました。こちらはUPX圧縮しても2.5キロバイトあります。(出力結果の673バイトより大きい……)
primojはエスペラントで、英語のprimesにあたる言葉です。