Created
September 21, 2023 10:42
-
-
Save tos-kamiya/fa5f90914d28819635a839bba7a0f342 to your computer and use it in GitHub Desktop.
A Fizz Buzz program
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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