Skip to content

Instantly share code, notes, and snippets.

@tos-kamiya
Created September 21, 2023 10:42
Show Gist options
  • Save tos-kamiya/fa5f90914d28819635a839bba7a0f342 to your computer and use it in GitHub Desktop.
Save tos-kamiya/fa5f90914d28819635a839bba7a0f342 to your computer and use it in GitHub Desktop.
A Fizz Buzz program
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static char num_fig_buf[4096]; // the size must be > 3 * 1000
unsigned int keta(unsigned int i)
{
unsigned int k = 0;
while (1) {
i /= 10;
++k;
if (i == 0) {
return k;
}
}
}
void sprint15(char *buf, unsigned int i, char *num_places[8])
{
unsigned int offset = keta(i) - 3;
char *p = buf;
num_places[0] = p + offset; p += sprintf(buf, "%d\n", i);
num_places[1] = p + offset; p += sprintf(p, "%d\n" "Fizz\n", i + 1);
num_places[2] = p + offset; p += sprintf(p, "%d\n" "Buzz\n" "Fizz\n", i + 3);
num_places[3] = p + offset; p += sprintf(p, "%d\n", i + 6);
num_places[4] = p + offset; p += sprintf(p, "%d\n" "Fizz\n" "Buzz\n", i + 7);
num_places[5] = p + offset; p += sprintf(p, "%d\n" "Fizz\n", i + 10);
num_places[6] = p + offset; p += sprintf(p, "%d\n", i + 12);
num_places[7] = p + offset; p += sprintf(p, "%d\n" "FizzBuzz\n", i + 13);
}
void sfill15(char *num_places[8], unsigned int i)
{
i = i % 1000;
memcpy(num_places[0], &num_fig_buf[i * 3], 3);
memcpy(num_places[1], &num_fig_buf[(i + 1) * 3], 3);
memcpy(num_places[2], &num_fig_buf[(i + 3) * 3], 3);
memcpy(num_places[3], &num_fig_buf[(i + 6) * 3], 3);
memcpy(num_places[4], &num_fig_buf[(i + 7) * 3], 3);
memcpy(num_places[5], &num_fig_buf[(i + 10) * 3], 3);
memcpy(num_places[6], &num_fig_buf[(i + 12) * 3], 3);
memcpy(num_places[7], &num_fig_buf[(i + 13) * 3], 3);
}
int main()
{
static char stdio_buffer[64 * 1024];
setvbuf(stdout, stdio_buffer, _IOFBF, sizeof(stdio_buffer));
char buf[4 * 1024]; // the size must be > (10 * 8 + 4 * 8 + 15) * 100
char *num_places[8];
unsigned int i;
for (i = 0; i < 1000; ++i) {
sprintf(&num_fig_buf[0] + i * 3, "%03d", i);
}
i = 1;
while (i < 1000) {
sprint15(buf, i, num_places);
fputs(buf, stdout);
i += 15;
}
sprint15(buf, i, num_places);
while (1) {
unsigned int i_start_mil = i / 1000;
unsigned int i_end_mil = (i + 15) / 1000;
if (i_start_mil == i_end_mil) {
sfill15(num_places, i);
fputs(buf, stdout);
i += 15;
} else {
sprint15(buf, i, num_places);
fputs(buf, stdout);
i += 15;
sprint15(buf, i, num_places);
}
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment