diff --git a/SherlockAndSquares.c b/SherlockAndSquares.c new file mode 100644 index 0000000..73a6a43 --- /dev/null +++ b/SherlockAndSquares.c @@ -0,0 +1,185 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +char* readline(); +char* ltrim(char*); +char* rtrim(char*); +char** split_string(char*); + +int parse_int(char*); + +/* + * Complete the 'squares' function below. + * + * The function is expected to return an INTEGER. + * The function accepts following parameters: + * 1. INTEGER a + * 2. INTEGER b + */ + +#include + +int squares(int a, int b) { + // Find the smallest integer whose square is >= a + int lower = ceil(sqrt(a)); + // Find the largest integer whose square is <= b + int upper = floor(sqrt(b)); + + // The count of perfect squares in the range is the difference between + // `upper` and `lower`, plus 1 (if lower <= upper) + if (lower > upper) { + return 0; + } + return upper - lower + 1; +} + +int main() +{ + FILE* fptr = fopen(getenv("OUTPUT_PATH"), "w"); + + int q = parse_int(ltrim(rtrim(readline()))); + + for (int q_itr = 0; q_itr < q; q_itr++) { + char** first_multiple_input = split_string(rtrim(readline())); + + int a = parse_int(*(first_multiple_input + 0)); + + int b = parse_int(*(first_multiple_input + 1)); + + int result = squares(a, b); + + fprintf(fptr, "%d\n", result); + } + + fclose(fptr); + + return 0; +} + +char* readline() { + size_t alloc_length = 1024; + size_t data_length = 0; + + char* data = malloc(alloc_length); + + while (true) { + char* cursor = data + data_length; + char* line = fgets(cursor, alloc_length - data_length, stdin); + + if (!line) { + break; + } + + data_length += strlen(cursor); + + if (data_length < alloc_length - 1 || data[data_length - 1] == '\n') { + break; + } + + alloc_length <<= 1; + + data = realloc(data, alloc_length); + + if (!data) { + data = '\0'; + + break; + } + } + + if (data[data_length - 1] == '\n') { + data[data_length - 1] = '\0'; + + data = realloc(data, data_length); + + if (!data) { + data = '\0'; + } + } else { + data = realloc(data, data_length + 1); + + if (!data) { + data = '\0'; + } else { + data[data_length] = '\0'; + } + } + + return data; +} + +char* ltrim(char* str) { + if (!str) { + return '\0'; + } + + if (!*str) { + return str; + } + + while (*str != '\0' && isspace(*str)) { + str++; + } + + return str; +} + +char* rtrim(char* str) { + if (!str) { + return '\0'; + } + + if (!*str) { + return str; + } + + char* end = str + strlen(str) - 1; + + while (end >= str && isspace(*end)) { + end--; + } + + *(end + 1) = '\0'; + + return str; +} + +char** split_string(char* str) { + char** splits = NULL; + char* token = strtok(str, " "); + + int spaces = 0; + + while (token) { + splits = realloc(splits, sizeof(char*) * ++spaces); + + if (!splits) { + return splits; + } + + splits[spaces - 1] = token; + + token = strtok(NULL, " "); + } + + return splits; +} + +int parse_int(char* str) { + char* endptr; + int value = strtol(str, &endptr, 10); + + if (endptr == str || *endptr != '\0') { + exit(EXIT_FAILURE); + } + + return value; +}