ぐいぐい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にあたる言葉です。