Compare commits

..

No commits in common. "main" and "v2" have entirely different histories.
main ... v2

122 changed files with 67 additions and 1466 deletions

2
.gitignore vendored
View File

@ -1,3 +1 @@
a.out a.out
main
debug

View File

@ -1,10 +0,0 @@
image: ${CI_REGISTRY}/ict/images/alpine/ci:latest
before_script:
apk add build-base bash
validate_code:
stage: test
script:
- chmod +x ./test/main.sh
- ./test/main.sh --all --gitlab

View File

@ -1,3 +1,4 @@
#include <ctype.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
@ -9,8 +10,14 @@
#define debug(fmt, ...) fprintf(stdout, "[DEBUG %s:%d %s()] " fmt "\n", __FILE__, __LINE__, __func__, ##__VA_ARGS__) #define debug(fmt, ...) fprintf(stdout, "[DEBUG %s:%d %s()] " fmt "\n", __FILE__, __LINE__, __func__, ##__VA_ARGS__)
#endif #endif
bool is_in_rgb_range(int color) { bool is_numeric(const char* str) {
return color >= 0 && color <= 255; if(*str == '\0') return false;
for(;*str; str++) {
if(!isdigit(*str))
return false;
}
return true;
} }
int invalid_input() { int invalid_input() {
@ -19,22 +26,73 @@ int invalid_input() {
} }
int main() { int main() {
int r = -1, g = -1, b = -1; char* input = NULL;
size_t len;
int rgb[3];
printf("Zadejte barvu v RGB formatu:\n"); printf("Zadejte barvu v RGB formatu:\n");
int inputs_read = scanf(" rgb ( %d , %d , %d )", &r, &g, &b); ssize_t chars_read = getline(&input, &len, stdin);
if(inputs_read != 3) { if(chars_read == -1) {
debug("Not enough inputs read"); printf("Failed to read from stdin\n");
return EXIT_FAILURE;
}
// Strip out any whitespaces
char* dst = input;
for(char * src = input; *src; src++) {
if(!isspace(*src)) {
*dst++ = *src;
}
}
*dst = '\0';
int trimmed_len = strlen(input);
// Check whether the provided input
// starts with rgb(
// and ends with )
if(strncmp(input, "rgb(", 4) != 0 || input[trimmed_len - 1] != ')') {
debug("%s not in rgb(xxx) format", input);
return invalid_input(); return invalid_input();
} }
if(!is_in_rgb_range(r) || !is_in_rgb_range(g) || !is_in_rgb_range(b)) { input[trimmed_len - 1] = '\0';
debug("Number not in range of rgb [0, 255]"); char* slice = input + 4;
char* token = strtok(slice, ",");
for(int i = 0; i < 3; i++) {
// strtok reached end prematurely
if(token == NULL) {
debug("Too few numbers");
return invalid_input(); return invalid_input();
} }
printf("#%02X%02X%02X\n", r, g, b); // Not a number
if(!is_numeric(token)) {
debug("%s is not a number", token);
return invalid_input();
}
int parsed = atoi(token);
if(parsed < 0 || parsed > 255) {
debug("%d out of RGB range", parsed);
return invalid_input();
}
rgb[i] = parsed;
token = strtok(NULL, ",");
}
if(token != NULL) {
debug("Too many numbers");
return invalid_input();
}
printf("#%02X%02X%02X\n", rgb[0], rgb[1], rgb[2]);
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }

View File

@ -1,104 +0,0 @@
Úkolem je realizovat program, který zobrazí tabulku pro násobilku.
Vstupem programu je celé číslo - mez n.
Výstupem programu je tabulka násobilky v rozsahu 1x1 až n x n. Tabulka je zobrazena bez duplicitních hodnot, tedy v trojúhelníkové podobě. Všechny sloupce mají stejnou šířku, šířka je dána počtem číslic v největším součinu v tabulce, zvětšeným o 1. Za posledním číslem na řádce následuje odřádkování, tedy na koncích řádky nejsou žádné bílé znaky navíc.
Pokud je vstup neplatný, program to musí detekovat a zobrazit chybové hlášení. Chybové hlášení zobrazujte na standardní výstup (ne na chybový výstup). Za chybu považujte:
- na vstupu není platné celé číslo,
- číslo na vstupu je záporné nebo nulové.
**Ukázka práce programu:**
```
Rozsah:
10
| 10 9 8 7 6 5 4 3 2 1
---+----------------------------------------
1| 10 9 8 7 6 5 4 3 2 1
2| 20 18 16 14 12 10 8 6 4
3| 30 27 24 21 18 15 12 9
4| 40 36 32 28 24 20 16
5| 50 45 40 35 30 25
6| 60 54 48 42 36
7| 70 63 56 49
8| 80 72 64
9| 90 81
10| 100
```
---
```
Rozsah:
8
| 8 7 6 5 4 3 2 1
--+------------------------
1| 8 7 6 5 4 3 2 1
2| 16 14 12 10 8 6 4
3| 24 21 18 15 12 9
4| 32 28 24 20 16
5| 40 35 30 25
6| 48 42 36
7| 56 49
8| 64
```
---
```
Rozsah:
32
| 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
----+----------------------------------------------------------------------------------------------------------------------------------------------------------------
1| 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
2| 64 62 60 58 56 54 52 50 48 46 44 42 40 38 36 34 32 30 28 26 24 22 20 18 16 14 12 10 8 6 4
3| 96 93 90 87 84 81 78 75 72 69 66 63 60 57 54 51 48 45 42 39 36 33 30 27 24 21 18 15 12 9
4| 128 124 120 116 112 108 104 100 96 92 88 84 80 76 72 68 64 60 56 52 48 44 40 36 32 28 24 20 16
5| 160 155 150 145 140 135 130 125 120 115 110 105 100 95 90 85 80 75 70 65 60 55 50 45 40 35 30 25
6| 192 186 180 174 168 162 156 150 144 138 132 126 120 114 108 102 96 90 84 78 72 66 60 54 48 42 36
7| 224 217 210 203 196 189 182 175 168 161 154 147 140 133 126 119 112 105 98 91 84 77 70 63 56 49
8| 256 248 240 232 224 216 208 200 192 184 176 168 160 152 144 136 128 120 112 104 96 88 80 72 64
9| 288 279 270 261 252 243 234 225 216 207 198 189 180 171 162 153 144 135 126 117 108 99 90 81
10| 320 310 300 290 280 270 260 250 240 230 220 210 200 190 180 170 160 150 140 130 120 110 100
11| 352 341 330 319 308 297 286 275 264 253 242 231 220 209 198 187 176 165 154 143 132 121
12| 384 372 360 348 336 324 312 300 288 276 264 252 240 228 216 204 192 180 168 156 144
13| 416 403 390 377 364 351 338 325 312 299 286 273 260 247 234 221 208 195 182 169
14| 448 434 420 406 392 378 364 350 336 322 308 294 280 266 252 238 224 210 196
15| 480 465 450 435 420 405 390 375 360 345 330 315 300 285 270 255 240 225
16| 512 496 480 464 448 432 416 400 384 368 352 336 320 304 288 272 256
17| 544 527 510 493 476 459 442 425 408 391 374 357 340 323 306 289
18| 576 558 540 522 504 486 468 450 432 414 396 378 360 342 324
19| 608 589 570 551 532 513 494 475 456 437 418 399 380 361
20| 640 620 600 580 560 540 520 500 480 460 440 420 400
21| 672 651 630 609 588 567 546 525 504 483 462 441
22| 704 682 660 638 616 594 572 550 528 506 484
23| 736 713 690 667 644 621 598 575 552 529
24| 768 744 720 696 672 648 624 600 576
25| 800 775 750 725 700 675 650 625
26| 832 806 780 754 728 702 676
27| 864 837 810 783 756 729
28| 896 868 840 812 784
29| 928 899 870 841
30| 960 930 900
31| 992 961
32| 1024
```
---
```
Rozsah:
asdf
Nespravny vstup.
```
---
Poznámky:
- Ukázkové běhy zachycují očekávané výpisy Vašeho programu (tučné písmo) a vstupy zadané uživatelem (základní písmo). Zvýraznění tučným písmem je použité pouze zde na stránce zadání, aby byl výpis lépe čitelný. Váš program má za úkol zobrazit text bez zvýrazňování (bez HTML markupu).
- Znak odřádkování (\n) je i za poslední řádkou výstupu (i za případným chybovým hlášením).
- Při programování si dejte pozor na přesnou podobu výpisů. Výstup Vašeho programu kontroluje stroj, který požaduje přesnou shodu výstupů Vašeho programu s výstupy referenčními. Za chybu je považováno, pokud se výpis liší. I chybějící nebo přebývající mezera/odřádkování je považováno za chybu. Abyste tyto problémy rychle vyloučili, použijte přiložený archiv se sadou vstupních a očekávaných výstupních dat. Podívejte se na videotutoriál (Courses -> Video tutoriály), jak testovací data použít a jak testování zautomatizovat.
- Výstup programu může být velmi široký/dlouhý, vyplatí se výstup přesměrovat do souboru a ten si prohlížet v nějakém editoru.

View File

@ -1,61 +0,0 @@
#include <stdlib.h>
#include <stdio.h>
int main() {
int range = -1;
printf("Rozsah:\n");
if (scanf("%d", &range) != 1 || range <= 0) {
printf("Nespravny vstup.\n");
return EXIT_FAILURE;
}
int largest_number = range * range;
int largest_digit_count = 0;
int range_digit_count = 0;
int tmp = largest_number;
while(tmp != 0) {
largest_digit_count++;
tmp /= 10;
}
tmp = range;
while(tmp != 0) {
range_digit_count++;
tmp /= 10;
}
// Header
for(int i = range + 1; i > 0; i--) {
if(i == range + 1) {
printf("%*s|", largest_digit_count, "");
continue;
}
printf("%*d", largest_digit_count + 1, i);
}
putchar('\n');
// Separator
for(int j = 0; j < largest_digit_count; j++) {
putchar('-');
}
putchar('+');
for(int j = 0; j < (largest_digit_count + 1) * range; j++) {
putchar('-');
}
putchar('\n');
// Table lines
for(int line = 1; line <= range; line++) {
printf("%*d|", largest_digit_count, line);
for(int column = range; column >= line; column--) {
printf("%*d", largest_digit_count + 1, column * line);
}
putchar('\n');
}
}

View File

@ -1,13 +0,0 @@
Rozsah:
| 10 9 8 7 6 5 4 3 2 1
---+----------------------------------------
1| 10 9 8 7 6 5 4 3 2 1
2| 20 18 16 14 12 10 8 6 4
3| 30 27 24 21 18 15 12 9
4| 40 36 32 28 24 20 16
5| 50 45 40 35 30 25
6| 60 54 48 42 36
7| 70 63 56 49
8| 80 72 64
9| 90 81
10| 100

View File

@ -1,13 +0,0 @@
Rozsah:
| 10 9 8 7 6 5 4 3 2 1
---+----------------------------------------
1| 10 9 8 7 6 5 4 3 2 1
2| 20 18 16 14 12 10 8 6 4
3| 30 27 24 21 18 15 12 9
4| 40 36 32 28 24 20 16
5| 50 45 40 35 30 25
6| 60 54 48 42 36
7| 70 63 56 49
8| 80 72 64
9| 90 81
10| 100

View File

@ -1,11 +0,0 @@
Rozsah:
| 8 7 6 5 4 3 2 1
--+------------------------
1| 8 7 6 5 4 3 2 1
2| 16 14 12 10 8 6 4
3| 24 21 18 15 12 9
4| 32 28 24 20 16
5| 40 35 30 25
6| 48 42 36
7| 56 49
8| 64

View File

@ -1,11 +0,0 @@
Rozsah:
| 8 7 6 5 4 3 2 1
--+------------------------
1| 8 7 6 5 4 3 2 1
2| 16 14 12 10 8 6 4
3| 24 21 18 15 12 9
4| 32 28 24 20 16
5| 40 35 30 25
6| 48 42 36
7| 56 49
8| 64

View File

@ -1,35 +0,0 @@
Rozsah:
| 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
----+----------------------------------------------------------------------------------------------------------------------------------------------------------------
1| 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
2| 64 62 60 58 56 54 52 50 48 46 44 42 40 38 36 34 32 30 28 26 24 22 20 18 16 14 12 10 8 6 4
3| 96 93 90 87 84 81 78 75 72 69 66 63 60 57 54 51 48 45 42 39 36 33 30 27 24 21 18 15 12 9
4| 128 124 120 116 112 108 104 100 96 92 88 84 80 76 72 68 64 60 56 52 48 44 40 36 32 28 24 20 16
5| 160 155 150 145 140 135 130 125 120 115 110 105 100 95 90 85 80 75 70 65 60 55 50 45 40 35 30 25
6| 192 186 180 174 168 162 156 150 144 138 132 126 120 114 108 102 96 90 84 78 72 66 60 54 48 42 36
7| 224 217 210 203 196 189 182 175 168 161 154 147 140 133 126 119 112 105 98 91 84 77 70 63 56 49
8| 256 248 240 232 224 216 208 200 192 184 176 168 160 152 144 136 128 120 112 104 96 88 80 72 64
9| 288 279 270 261 252 243 234 225 216 207 198 189 180 171 162 153 144 135 126 117 108 99 90 81
10| 320 310 300 290 280 270 260 250 240 230 220 210 200 190 180 170 160 150 140 130 120 110 100
11| 352 341 330 319 308 297 286 275 264 253 242 231 220 209 198 187 176 165 154 143 132 121
12| 384 372 360 348 336 324 312 300 288 276 264 252 240 228 216 204 192 180 168 156 144
13| 416 403 390 377 364 351 338 325 312 299 286 273 260 247 234 221 208 195 182 169
14| 448 434 420 406 392 378 364 350 336 322 308 294 280 266 252 238 224 210 196
15| 480 465 450 435 420 405 390 375 360 345 330 315 300 285 270 255 240 225
16| 512 496 480 464 448 432 416 400 384 368 352 336 320 304 288 272 256
17| 544 527 510 493 476 459 442 425 408 391 374 357 340 323 306 289
18| 576 558 540 522 504 486 468 450 432 414 396 378 360 342 324
19| 608 589 570 551 532 513 494 475 456 437 418 399 380 361
20| 640 620 600 580 560 540 520 500 480 460 440 420 400
21| 672 651 630 609 588 567 546 525 504 483 462 441
22| 704 682 660 638 616 594 572 550 528 506 484
23| 736 713 690 667 644 621 598 575 552 529
24| 768 744 720 696 672 648 624 600 576
25| 800 775 750 725 700 675 650 625
26| 832 806 780 754 728 702 676
27| 864 837 810 783 756 729
28| 896 868 840 812 784
29| 928 899 870 841
30| 960 930 900
31| 992 961
32| 1024

View File

@ -1,35 +0,0 @@
Rozsah:
| 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
----+----------------------------------------------------------------------------------------------------------------------------------------------------------------
1| 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
2| 64 62 60 58 56 54 52 50 48 46 44 42 40 38 36 34 32 30 28 26 24 22 20 18 16 14 12 10 8 6 4
3| 96 93 90 87 84 81 78 75 72 69 66 63 60 57 54 51 48 45 42 39 36 33 30 27 24 21 18 15 12 9
4| 128 124 120 116 112 108 104 100 96 92 88 84 80 76 72 68 64 60 56 52 48 44 40 36 32 28 24 20 16
5| 160 155 150 145 140 135 130 125 120 115 110 105 100 95 90 85 80 75 70 65 60 55 50 45 40 35 30 25
6| 192 186 180 174 168 162 156 150 144 138 132 126 120 114 108 102 96 90 84 78 72 66 60 54 48 42 36
7| 224 217 210 203 196 189 182 175 168 161 154 147 140 133 126 119 112 105 98 91 84 77 70 63 56 49
8| 256 248 240 232 224 216 208 200 192 184 176 168 160 152 144 136 128 120 112 104 96 88 80 72 64
9| 288 279 270 261 252 243 234 225 216 207 198 189 180 171 162 153 144 135 126 117 108 99 90 81
10| 320 310 300 290 280 270 260 250 240 230 220 210 200 190 180 170 160 150 140 130 120 110 100
11| 352 341 330 319 308 297 286 275 264 253 242 231 220 209 198 187 176 165 154 143 132 121
12| 384 372 360 348 336 324 312 300 288 276 264 252 240 228 216 204 192 180 168 156 144
13| 416 403 390 377 364 351 338 325 312 299 286 273 260 247 234 221 208 195 182 169
14| 448 434 420 406 392 378 364 350 336 322 308 294 280 266 252 238 224 210 196
15| 480 465 450 435 420 405 390 375 360 345 330 315 300 285 270 255 240 225
16| 512 496 480 464 448 432 416 400 384 368 352 336 320 304 288 272 256
17| 544 527 510 493 476 459 442 425 408 391 374 357 340 323 306 289
18| 576 558 540 522 504 486 468 450 432 414 396 378 360 342 324
19| 608 589 570 551 532 513 494 475 456 437 418 399 380 361
20| 640 620 600 580 560 540 520 500 480 460 440 420 400
21| 672 651 630 609 588 567 546 525 504 483 462 441
22| 704 682 660 638 616 594 572 550 528 506 484
23| 736 713 690 667 644 621 598 575 552 529
24| 768 744 720 696 672 648 624 600 576
25| 800 775 750 725 700 675 650 625
26| 832 806 780 754 728 702 676
27| 864 837 810 783 756 729
28| 896 868 840 812 784
29| 928 899 870 841
30| 960 930 900
31| 992 961
32| 1024

View File

@ -1,2 +0,0 @@
Rozsah:
Nespravny vstup.

View File

@ -1,2 +0,0 @@
Rozsah:
Nespravny vstup.

View File

@ -1,2 +0,0 @@
Rozsah:
Nespravny vstup.

View File

@ -1,84 +0,0 @@
Úkolem je vytvořit program, který bude zpracovávat jednoduché matematické vzorce.
Na vstupu dostanete dvě desetinná čísla oddělená znakem operace a zakončená znakem rovná se. Vaším úkolem je vypočítat hodnotu podle zadaného operátoru:
- pro + určit součet,
- pro - určit rozdíl,
- pro * určit součin,
- pro / určit celočíselný podíl (např. 3.5 / 1.5 = 2, kolikrát se do dělence vejde celý dělitel).
Jiné operace program nebude umět a vypíše pro ně chybové hlášení. Formát vstupu a výstupu je vidět níže na ukázce práce programu.
Pokud je vstup neplatný, program to musí detekovat a zobrazit chybové hlášení. Chybové hlášení zobrazujte na standardní výstup (ne na chybový výstup). Za chybu považujte:
- zadané číslo není validní desetinné číslo,
- dělitel je 0 pro operaci /,
- čísla nejsou oddělena validním operátorem (+, -, * nebo /),
- za posledním číslem se nenachází znak =.
**Ukázka práce programu:**
```
Zadejte vzorec:
3.5 + 1.5 =
5
```
---
```
Zadejte vzorec:
3.5 / 1.5 =
2
```
---
```
Zadejte vzorec:
1000000 * 1.5e+8 =
1.5e+14
```
---
```
Zadejte vzorec:
7 / -1 =
-7
```
---
```
Zadejte vzorec:
abc / 1 =
Nespravny vstup.
```
---
```
Zadejte vzorec:
4 & 10 =
Nespravny vstup.
```
Poznámky:
- Ukázkové běhy zachycují očekávané výpisy Vašeho programu (tučné písmo) a vstupy zadané uživatelem (základní písmo). Zvýraznění tučným písmem je použité pouze zde na stránce zadání, aby byl výpis lépe čitelný. Váš program má za úkol zobrazit text bez zvýrazňování (bez HTML markupu).
- Znak odřádkování (\n) je i za poslední řádkou výstupu (i za případným chybovým hlášením).
- Pro reprezentaci hodnot použijte desetinná čísla typu double. Nepoužívejte typ float, jeho přesnost nemusí být dostatečná.
- Při programování si dejte pozor na přesnou podobu výpisů. Výstup Vašeho programu kontroluje stroj, který požaduje přesnou shodu výstupů Vašeho programu s výstupy referenčními. Za chybu je považováno, pokud se výpis liší. I chybějící nebo přebývající mezera/odřádkování je považováno za chybu. Abyste tyto problémy rychle vyloučili, použijte přiložený archiv se sadou vstupních a očekávaných výstupních dat. Podívejte se na videotutoriál (Courses -> Video tutoriály), jak testovací data použít a jak testování zautomatizovat.
- Výsledná hodnota je porovnávána jako desetinné číslo s tolerancí 1 promile.
- Váš program bude spouštěn v omezeném testovacím prostředí. Je omezen dobou běhu (limit je vidět v logu referenčního řešení) a dále je omezena i velikost dostupné paměti (ale tato úloha by ani s jedním omezením neměla mít problém).
- Slovní popis struktury platných vstupních dat není zcela exaktní. Proto připojujeme i formální popis vstupního jazyka v EBNF:
```
input ::= { whiteSpace } decimal { whiteSpace } op { whiteSpace } decimal { whiteSpace } '='
whiteSpace ::= ' ' | '\t' | '\n' | '\r'
decimal ::= [ '+' | '-' ] integer [ '.' integer [ ( 'e' | 'E' ) [ '+' | '-' ] integer ] ] |
[ '+' | '-' ] '.' integer [ ( 'e' | 'E' ) [ '+' | '-' ] integer ]
integer ::= digit { digit }
digit ::= '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'
op ::= '+' | '-' | '*' | '/'
```

View File

@ -1,53 +0,0 @@
#include <limits.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
printf("Zadejte vzorec:\n");
double num1, num2;
char op;
char equal_sign;
if (scanf("%lf %c %lf %c", &num1, &op, &num2, &equal_sign) != 4 || equal_sign != '=') {
printf("Nespravny vstup.\n");
return EXIT_FAILURE;
}
if (op != '+' && op != '-' && op != '*' && op != '/') {
printf("Nespravny vstup.\n");
return EXIT_FAILURE;
}
if (op == '/' && num2 == 0) {
printf("Nespravny vstup.\n");
return EXIT_FAILURE;
}
double result = 0;
switch (op) {
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
result = num1 / num2;
if (result < 0) {
result = ceil(num1 / num2);
} else {
result = floor(num1 / num2);
}
break;
}
if (fabs(result - (int)result) < 1e-9) {
printf("%ld\n", (long)result);
} else {
printf("%.12g\n", result);
}
}

View File

@ -1 +0,0 @@
3.5 + 1.5 =

View File

@ -1,2 +0,0 @@
Zadejte vzorec:
5

View File

@ -1,2 +0,0 @@
Zadejte vzorec:
5

View File

@ -1 +0,0 @@
3.5 / 1.5 =

View File

@ -1,2 +0,0 @@
Zadejte vzorec:
2

View File

@ -1,2 +0,0 @@
Zadejte vzorec:
2

View File

@ -1 +0,0 @@
1000000 * 1.5e+8 =

View File

@ -1,2 +0,0 @@
Zadejte vzorec:
1.5e+14

View File

@ -1,2 +0,0 @@
Zadejte vzorec:
1.5e+14

View File

@ -1 +0,0 @@
7 / -1 =

View File

@ -1,2 +0,0 @@
Zadejte vzorec:
-7

View File

@ -1,2 +0,0 @@
Zadejte vzorec:
-7

View File

@ -1 +0,0 @@
abc / 1 =

View File

@ -1,2 +0,0 @@
Zadejte vzorec:
Nespravny vstup.

View File

@ -1,2 +0,0 @@
Zadejte vzorec:
Nespravny vstup.

View File

@ -1 +0,0 @@
4 & 10 =

View File

@ -1,2 +0,0 @@
Zadejte vzorec:
Nespravny vstup.

View File

@ -1,2 +0,0 @@
Zadejte vzorec:
Nespravny vstup.

View File

@ -1 +0,0 @@
0.848905 * 0.783596 =

View File

@ -1,2 +0,0 @@
Zadejte vzorec:
0.66519856238

View File

@ -1 +0,0 @@
-3.5 / 1.5 =

View File

@ -1,2 +0,0 @@
Zadejte vzorec:
-2

View File

@ -1 +0,0 @@
0.984813 / 0.360992 =

View File

@ -1,2 +0,0 @@
Zadejte vzorec:
2

View File

@ -1 +0,0 @@
2 * 3

View File

@ -1,2 +0,0 @@
Zadejte vzorec:
Nespravny vstup.

View File

@ -1,98 +0,0 @@
Úkolem je napsat program, který rozhodne vzájemnou polohu 2 kružnic.
Vstupem programu je zadání dvou kružnic. Každá kružnice je zadaná svým středem (x a y souřadnice) a poloměrem. Čísla jsou zadaná v pořadí x y r, jedná se o desetinná čísla.
Výstupem programu je rozhodnutí o vzájemné poloze kružnic. Celkem může nastat 6 variant vzájemné polohy:
- kružnice splývají,
- jedna kružnice leží zcela uvnitř druhé,
- jedna kružnice se zevnitř dotýká druhé,
- kružnice se protínají,
- kružnice se dotýkají zvenku,
- kružnice leží zcela mimo sebe.
Program rozhodne o poloze a vypíše ji. Dále, pokud je to relevantní, program vypíše plochu překryvu kružnic. Formát výstupu pro všech 6 variant je uveden v ukázkovém běhu níže. Pozor, za výstupem je odřádkování (\n).
Program musí být schopen detekovat nesprávný vstup. Pokud je na vstupu nesmyslné zadání, program to zjistí, vypíše chybové hlášení a ukončí se. Formát chybového hlášení je uveden v ukázce níže. Pozor, za případným chybovým hlášením je odřádkování (\n). Chybové hlášení zasílejte na standardní výstup (printf), nezasílejte jej na chybový výstup. Za chybu je považováno:
- nečíselná hodnota nějaké souřadnice,
- nečíselná hodnota poloměru,
- poloměr nulový nebo záporný.
**Ukázka práce programu:**
```
Zadejte parametry kruznice #1:
0 0 5
Zadejte parametry kruznice #2:
0 10 5
Vnejsi dotyk, zadny prekryv.
```
---
```
Zadejte parametry kruznice #1:
0 0 3
Zadejte parametry kruznice #2:
1.5 1.5 0.8
Kruznice #2 lezi uvnitr kruznice #1, prekryv: 2.010619
```
---
```
Zadejte parametry kruznice #1:
0 0 4
Zadejte parametry kruznice #2:
2 0 2
Vnitrni dotyk, kruznice #2 lezi uvnitr kruznice #1, prekryv: 12.566371
```
---
```
Zadejte parametry kruznice #1:
0 0 5
Zadejte parametry kruznice #2:
100 100 10
Kruznice lezi vne sebe, zadny prekryv.
```
---
```
Zadejte parametry kruznice #1:
0 0 4.5
Zadejte parametry kruznice #2:
10 10 15
Kruznice se protinaji, prekryv: 37.475800
```
---
```
Zadejte parametry kruznice #1:
-10.25 -20.5 4
Zadejte parametry kruznice #2:
-10.25 -20.5 4
Kruznice splyvaji, prekryv: 50.265482
```
---
```
Zadejte parametry kruznice #1:
0 0 -2
Nespravny vstup.
```
---
```
Zadejte parametry kruznice #1:
0 12 5
Zadejte parametry kruznice #2:
3 7 abc
Nespravny vstup.
```

View File

@ -1,137 +0,0 @@
#include <float.h>
#include <math.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#ifdef __PROGTEST__
#define debug(...) ((void)0)
#else
#define debug(fmt, ...) \
fprintf(stdout, "[%s:%d %s()] " fmt "\n", __FILE__, __LINE__, __func__, \
##__VA_ARGS__)
#endif
double clamp(double d) {
if (d > 1.0) {
return 1.0;
} else if (d < -1.0) {
return -1.0;
} else {
return d;
}
}
// https://www.geeksforgeeks.org/dsa/area-of-intersection-of-two-circles/
double intersection_area(double a_r, double b_r, double distance) {
double a_square = a_r * a_r;
double b_square = b_r * b_r;
double distance_square = distance * distance;
double alpha_acos =
(distance_square + a_square - b_square) / (2 * a_r * distance);
double beta_acos =
(distance_square + b_square - a_square) / (2 * b_r * distance);
double alpha = acos(clamp(alpha_acos)) * 2;
double beta = acos(clamp(beta_acos)) * 2;
double a1 = 0.5 * beta * b_square - 0.5 * b_square * sin(beta);
double a2 = 0.5 * alpha * a_square - 0.5 * a_square * sin(alpha);
double area = a1 + a2;
debug("Area = %lf", area);
return area;
}
double circle_area(double radius) { return M_PI * radius * radius; }
int main() {
double a_center_x = 0, a_center_y = 0, a_radius = 0, b_center_x = 0,
b_center_y = 0, b_radius = 0;
printf("Zadejte parametry kruznice #1:\n");
int inputs_read = scanf("%lf %lf %lf", &a_center_x, &a_center_y, &a_radius);
if (inputs_read != 3 || a_radius <= 0) {
printf("Nespravny vstup.\n");
return EXIT_FAILURE;
}
printf("Zadejte parametry kruznice #2:\n");
inputs_read = scanf("%lf %lf %lf", &b_center_x, &b_center_y, &b_radius);
if (inputs_read != 3 || b_radius <= 0) {
printf("Nespravny vstup.\n");
return EXIT_FAILURE;
}
double center_distance =
sqrt((b_center_x - a_center_x) * (b_center_x - a_center_x) +
(b_center_y - a_center_y) * (b_center_y - a_center_y));
debug("Distance of centers = %0.60lf", center_distance);
debug("Radii difference = %0.60lf", a_radius - b_radius);
debug("Radii difference = %0.60lf", b_radius - a_radius);
debug("Center + #1 = %0.60lf", a_center_x + a_radius);
debug("Center + #2 = %0.60lf", b_center_x + b_radius);
double radii_sum = a_radius + b_radius;
double radii_difference = fabs(a_radius - b_radius);
double epsilon = 100 * DBL_EPSILON * fmax(a_radius, b_radius);
// Both origin points and radii are identical
bool are_identical = a_center_x == b_center_x && a_center_y == b_center_y && a_radius == b_radius;
// d = r1 + r2
// d - r1 - r1 < epsilon
bool are_touching_from_outside = fabs(center_distance - radii_sum) < epsilon;
// d = |r1 - r2|
// d - |r1 - r2| < epsilon
bool are_touching_from_inside = fabs(center_distance - radii_difference) < epsilon;
// d < |r1 - r2|
bool is_fully_inside = center_distance < radii_difference;
// d < r1 + r2
bool are_overlapping = center_distance < radii_sum;
if (are_identical) {
printf("Kruznice splyvaji, prekryv: %lf\n", circle_area(a_radius));
}
else if (are_touching_from_inside) {
if (a_radius > b_radius) {
printf(
"Vnitrni dotyk, kruznice #2 lezi uvnitr kruznice #1, prekryv: %lf\n",
circle_area(b_radius));
} else {
printf(
"Vnitrni dotyk, kruznice #1 lezi uvnitr kruznice #2, prekryv: %lf\n",
circle_area(a_radius));
}
}
else if (are_touching_from_outside) {
printf("Vnejsi dotyk, zadny prekryv.\n");
}
else if (is_fully_inside) {
if (a_radius > b_radius) {
printf("Kruznice #2 lezi uvnitr kruznice #1, prekryv: %lf\n",
circle_area(b_radius));
} else {
printf("Kruznice #1 lezi uvnitr kruznice #2, prekryv: %lf\n",
circle_area(a_radius));
}
}
else if (are_overlapping) {
printf("Kruznice se protinaji, prekryv: %lf\n",
intersection_area(a_radius, b_radius, center_distance));
}
else {
printf("Kruznice lezi vne sebe, zadny prekryv.\n");
}
return EXIT_SUCCESS;
}

View File

@ -1,2 +0,0 @@
0 0 5
0 10 5

View File

@ -1,3 +0,0 @@
Zadejte parametry kruznice #1:
Zadejte parametry kruznice #2:
Vnejsi dotyk, zadny prekryv.

View File

@ -1,3 +0,0 @@
Zadejte parametry kruznice #1:
Zadejte parametry kruznice #2:
Vnejsi dotyk, zadny prekryv.

View File

@ -1,2 +0,0 @@
0 0 3
1.5 1.5 0.8

View File

@ -1,3 +0,0 @@
Zadejte parametry kruznice #1:
Zadejte parametry kruznice #2:
Kruznice #2 lezi uvnitr kruznice #1, prekryv: 2.010619

View File

@ -1,3 +0,0 @@
Zadejte parametry kruznice #1:
Zadejte parametry kruznice #2:
Kruznice #2 lezi uvnitr kruznice #1, prekryv: 2.010619

View File

@ -1,2 +0,0 @@
0 0 4
2 0 2

View File

@ -1,3 +0,0 @@
Zadejte parametry kruznice #1:
Zadejte parametry kruznice #2:
Vnitrni dotyk, kruznice #2 lezi uvnitr kruznice #1, prekryv: 12.566371

View File

@ -1,3 +0,0 @@
Zadejte parametry kruznice #1:
Zadejte parametry kruznice #2:
Vnitrni dotyk, kruznice #2 lezi uvnitr kruznice #1, prekryv: 12.566371

View File

@ -1,2 +0,0 @@
0 0 5
100 100 10

View File

@ -1,3 +0,0 @@
Zadejte parametry kruznice #1:
Zadejte parametry kruznice #2:
Kruznice lezi vne sebe, zadny prekryv.

View File

@ -1,3 +0,0 @@
Zadejte parametry kruznice #1:
Zadejte parametry kruznice #2:
Kruznice lezi vne sebe, zadny prekryv.

View File

@ -1,2 +0,0 @@
0 0 4.5
10 10 15

View File

@ -1,3 +0,0 @@
Zadejte parametry kruznice #1:
Zadejte parametry kruznice #2:
Kruznice se protinaji, prekryv: 37.475800

View File

@ -1,3 +0,0 @@
Zadejte parametry kruznice #1:
Zadejte parametry kruznice #2:
Kruznice se protinaji, prekryv: 37.475800

View File

@ -1,2 +0,0 @@
-10.25 -20.5 4
-10.25 -20.5 4

View File

@ -1,3 +0,0 @@
Zadejte parametry kruznice #1:
Zadejte parametry kruznice #2:
Kruznice splyvaji, prekryv: 50.265482

View File

@ -1,3 +0,0 @@
Zadejte parametry kruznice #1:
Zadejte parametry kruznice #2:
Kruznice splyvaji, prekryv: 50.265482

View File

@ -1 +0,0 @@
0 0 -2

View File

@ -1,2 +0,0 @@
Zadejte parametry kruznice #1:
Nespravny vstup.

View File

@ -1,2 +0,0 @@
Zadejte parametry kruznice #1:
Nespravny vstup.

View File

@ -1,2 +0,0 @@
0 12 5
3 7 abc

View File

@ -1,3 +0,0 @@
Zadejte parametry kruznice #1:
Zadejte parametry kruznice #2:
Nespravny vstup.

View File

@ -1,3 +0,0 @@
Zadejte parametry kruznice #1:
Zadejte parametry kruznice #2:
Nespravny vstup.

View File

@ -1,2 +0,0 @@
9.7e-39 -1.85e-38 4.16e-38
4.03e-38 2.3e-39 4.6e-39

View File

@ -1,3 +0,0 @@
Zadejte parametry kruznice #1:
Zadejte parametry kruznice #2:
Vnitrni dotyk, kruznice #2 lezi uvnitr kruznice #1, prekryv: 0.000000

View File

@ -1,2 +0,0 @@
4.03e-38 2.3e-39 4.6e-39
9.7e-39 -1.85e-38 4.16e-38

View File

@ -1,3 +0,0 @@
Zadejte parametry kruznice #1:
Zadejte parametry kruznice #2:
Vnitrni dotyk, kruznice #1 lezi uvnitr kruznice #2, prekryv: 0.000000

View File

@ -1,2 +0,0 @@
-2.21e-38 -1.11e-38 1.4862e-36
1.2253e-36 5.721e-37 1.092e-37

View File

@ -1,3 +0,0 @@
Zadejte parametry kruznice #1:
Zadejte parametry kruznice #2:
Vnitrni dotyk, kruznice #2 lezi uvnitr kruznice #1, prekryv: 0.000000

View File

@ -1,261 +0,0 @@
Úkolem je vytvořit program, který bude počítat a zobrazovat počty traťových dílců potřebných pro stavbu trati zadané délky.
Předpokládáme, že výrobce dodává traťové dílce dvou velikostí. Úkolem je určit počty potřebných traťových dílců jednotlivých velikostí, které jsou potřebné pro výstavbu trati zadané délky. Při stavbě trati musíme používat dílce vždy celé (nelze je krátit).
Vstupem programu je zadání délek vyráběných traťových dílců. Jedná se o dvě navzájem různá celá čísla. Po tomto vstupu následuje zadání délky trati ke stavbě. Pro zadanou délku trati program vypočte potřebné množství traťových dílců. Zadání délky je navíc dvojího druhu:
- \- délka pro toto zadání program zobrazí kolika různými způsoby lze traťové dílce kombinovat,
- \+ délka pro toto zadání program vypíše nalezené kombinace a zobrazí jejich počet.
Výstupem programu je počet možných způsobů, kterými lze zkombinovat traťové dílce pro zadanou vzdálenost. Podle vstupu (znaku + či - v zadání) se dále zobrazí či nezobrazí i výpis jednotlivých možných kombinací. Přesný formát výstupu je v ukázce níže. Pokud zadanou délku nelze z vyráběných dílců sestavit, program pro zadaný vstup vypíše informaci podle ukázky. Pozor, za výpisem je odřádkování (\n).
Pokud je vstup neplatný, program to musí detekovat, zobrazit chybové hlášení a ukončit se. Chybové hlášení zobrazujte na standardní výstup (ne na chybový výstup). Za chybu považujte:
- délky vyráběných traťových dílců jsou nečíselné, záporné, nulové nebo jsou obě délky shodné,
- při zadávání délky nebyl použit ani znak + ani - pro zapnutí/vypnutí úplného výpisu všech kombinací,
- zadání délky trati je nečíselné nebo záporné.
Program v základní verzi pracuje s malými čísly, tedy k vyřešení stačí naivní algoritmus kontrolující přípustné možnosti. Pokud má být zobrazován kompletní výpis všech možných kombinací, nelze algoritmus příliš vylepšovat. Úloha nabízí bonusový test. V tomto testu se testuje, zda řešení dokáže rychle počítat počty možných kombinací (pracuje pouze v režimu -, tedy bez výpisu všech nalezených kombinací). Pokud bonusový test zvládnete, dostane řešení více než nominálních 100% bodů. Pokud v programu použijete pouze naivní algoritmus, bonusovým testem neprojdete a získáte nejvýše nominální hodnocení 100% bodů.
Při programování si dejte pozor na přesnou podobu výpisů. Výstup Vašeho programu kontroluje stroj, který požaduje přesnou shodu výstupů Vašeho programu s výstupy referenčními. Za chybu je považováno, pokud se výpis liší. I chybějící nebo přebývající mezera/odřádkování je považováno za chybu. Abyste tyto problémy rychle vyloučili, použijte přiložený archiv se sadou vstupních a očekávaných výstupních dat.
Váš program bude spouštěn v omezeném testovacím prostředí. Je omezen dobou běhu (limit je vidět v logu referenčního řešení) a dále je omezena i velikost dostupné paměti (ale tato úloha by ani s jedním omezením neměla mít v povinných testech problém). Zvládnutí bonusového testu již vyžaduje lepší algoritmus.
**Ukázka práce programu:**
```
Delky koleji:
10 13
Vzdalenost:
+ 100
= 10 * 10 + 13 * 0
Celkem variant: 1
```
---
```
Delky koleji:
10 13
Vzdalenost:
+ 749
= 10 * 32 + 13 * 33
= 10 * 19 + 13 * 43
= 10 * 6 + 13 * 53
= 10 * 71 + 13 * 3
= 10 * 58 + 13 * 13
= 10 * 45 + 13 * 23
Celkem variant: 6
```
---
```
Delky koleji:
10 13
Vzdalenost:
+ 71
Reseni neexistuje.
```
---
```
Delky koleji:
10 13
Vzdalenost:
+ 0
= 10 * 0 + 13 * 0
Celkem variant: 1
```
---
```
Delky koleji:
54 16
Vzdalenost:
+ 121
Reseni neexistuje.
```
---
```
Delky koleji:
54 16
Vzdalenost:
+ 2400
= 54 * 16 + 16 * 96
= 54 * 8 + 16 * 123
= 54 * 0 + 16 * 150
= 54 * 40 + 16 * 15
= 54 * 32 + 16 * 42
= 54 * 24 + 16 * 69
Celkem variant: 6
```
---
```
Delky koleji:
173 459
Vzdalenost:
- 5219
Reseni neexistuje.
```
---
```
Delky koleji:
173 459
Vzdalenost:
- 234875
Celkem variant: 3
```
---
```
Delky koleji:
22 33
Vzdalenost:
* 12
Nespravny vstup.
```
---
```
Delky koleji:
10 abc
Nespravny vstup.
```
**Poznámky:**
- Ukázkové běhy zachycují očekávané výpisy Vašeho programu (tučné písmo) a vstupy zadané uživatelem (základní písmo). Zvýraznění tučným písmem je použité pouze zde na stránce zadání, aby byl výpis lépe čitelný. Váš program má za úkol pouze zobrazit text bez zvýrazňování (bez HTML markupu).
- Znak odřádkování (\n) je i za poslední řádkou výstupu (i za případným chybovým hlášením).
- Výpis nalezených kombinací (pokud je požadován) nemá určené pořadí. Testovací prostředí si v případě potřeby pořadí před porovnáním prohodí. Tedy například pro dílce délky 13 17 a požadovanou délku tratě 7111 jsou za správné považované následující výpisy:
```
= 13 * 190 + 17 * 273
= 13 * 428 + 17 * 91
= 13 * 105 + 17 * 338
= 13 * 343 + 17 * 156
= 13 * 20 + 17 * 403
= 13 * 258 + 17 * 221
= 13 * 496 + 17 * 39
= 13 * 173 + 17 * 286
= 13 * 411 + 17 * 104
= 13 * 88 + 17 * 351
= 13 * 326 + 17 * 169
= 13 * 3 + 17 * 416
= 13 * 241 + 17 * 234
= 13 * 479 + 17 * 52
= 13 * 156 + 17 * 299
= 13 * 394 + 17 * 117
= 13 * 71 + 17 * 364
= 13 * 309 + 17 * 182
= 13 * 547 + 17 * 0
= 13 * 224 + 17 * 247
= 13 * 462 + 17 * 65
= 13 * 139 + 17 * 312
= 13 * 377 + 17 * 130
= 13 * 54 + 17 * 377
= 13 * 292 + 17 * 195
= 13 * 530 + 17 * 13
= 13 * 207 + 17 * 260
= 13 * 445 + 17 * 78
= 13 * 122 + 17 * 325
= 13 * 360 + 17 * 143
= 13 * 37 + 17 * 390
= 13 * 275 + 17 * 208
= 13 * 513 + 17 * 26
Celkem variant: 33
```
---
```
= 13 * 428 + 17 * 91
= 13 * 190 + 17 * 273
= 13 * 105 + 17 * 338
= 13 * 343 + 17 * 156
= 13 * 20 + 17 * 403
= 13 * 258 + 17 * 221
= 13 * 496 + 17 * 39
= 13 * 173 + 17 * 286
= 13 * 411 + 17 * 104
= 13 * 88 + 17 * 351
= 13 * 326 + 17 * 169
= 13 * 3 + 17 * 416
= 13 * 241 + 17 * 234
= 13 * 479 + 17 * 52
= 13 * 156 + 17 * 299
= 13 * 394 + 17 * 117
= 13 * 71 + 17 * 364
= 13 * 309 + 17 * 182
= 13 * 547 + 17 * 0
= 13 * 224 + 17 * 247
= 13 * 462 + 17 * 65
= 13 * 139 + 17 * 312
= 13 * 377 + 17 * 130
= 13 * 54 + 17 * 377
= 13 * 292 + 17 * 195
= 13 * 530 + 17 * 13
= 13 * 207 + 17 * 260
= 13 * 445 + 17 * 78
= 13 * 122 + 17 * 325
= 13 * 360 + 17 * 143
= 13 * 37 + 17 * 390
= 13 * 275 + 17 * 208
= 13 * 513 + 17 * 26
Celkem variant: 33
```
---
```
= 13 * 20 + 17 * 403
= 13 * 428 + 17 * 91
= 13 * 190 + 17 * 273
= 13 * 105 + 17 * 338
= 13 * 343 + 17 * 156
= 13 * 258 + 17 * 221
= 13 * 496 + 17 * 39
= 13 * 173 + 17 * 286
= 13 * 411 + 17 * 104
= 13 * 88 + 17 * 351
= 13 * 326 + 17 * 169
= 13 * 3 + 17 * 416
= 13 * 241 + 17 * 234
= 13 * 479 + 17 * 52
= 13 * 156 + 17 * 299
= 13 * 394 + 17 * 117
= 13 * 71 + 17 * 364
= 13 * 309 + 17 * 182
= 13 * 547 + 17 * 0
= 13 * 224 + 17 * 247
= 13 * 462 + 17 * 65
= 13 * 139 + 17 * 312
= 13 * 377 + 17 * 130
= 13 * 54 + 17 * 377
= 13 * 292 + 17 * 195
= 13 * 530 + 17 * 13
= 13 * 207 + 17 * 260
= 13 * 445 + 17 * 78
= 13 * 122 + 17 * 325
= 13 * 360 + 17 * 143
= 13 * 37 + 17 * 390
= 13 * 275 + 17 * 208
= 13 * 513 + 17 * 26
Celkem variant: 33
```
a libovolná další ze zbývajících 8683317618811886495518194401279999997 permutací.
- Při kontrole výstupů Vašeho programu nelze přímo porovnávat Váš výpis a referenční výpis. Před porovnáním budete nejspíše muset upravit pořadí nalezených kombinací. Odpovídající nástroje jsou probírané v BI-UOS.
- Při programování si dejte pozor na rozsah použitých datových typů. Pro povinné testy lze vystačit s datovým typem int. Pokud chcete projít i bonusovým testem, je potřeba používat datový typ s větším rozsahem (long long).
- Rozsah datových typů lze snadno překročit i nevhodným pořadím prováděných operací. Pokud například potřrbujete spočítat výraz
- Pro načtení znaménka +/- ze vstupu se hodí formát "%c" nebo " %c". Rozdíl mezi těmito konverzemi je dobře popsaný v manuálu k funkci scanf.

View File

@ -1,159 +0,0 @@
#include <math.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#ifdef __PROGTEST__
#define debug(...) ((void)0)
#else
#define debug(fmt, ...) \
printf("[DEBUG %s:%d %s()] " fmt "\n", __FILE__, __LINE__, \
__func__, ##__VA_ARGS__)
#endif
typedef long long int lli;
typedef long double ld;
typedef struct rails_t {
lli r1;
lli r2;
lli d;
} rails_t;
typedef struct eea_gcd_t {
lli g;
lli x;
lli y;
} eea_gcd_t;
int invalid_input() {
printf("Nespravny vstup.\n");
return EXIT_FAILURE;
}
eea_gcd_t extended_euclidian_gcd(lli a, lli b) {
if (a == 0) {
eea_gcd_t res;
res.g = b;
res.x = 0;
res.y = 1;
return res;
}
eea_gcd_t res = extended_euclidian_gcd(b % a, a);
lli x = res.y - (b / a) * res.x;
lli y = res.x;
res.x = x;
res.y = y;
return res;
}
lli find_solutions(rails_t rails, bool verbose) {
lli variants = 0;
if (rails.d == 0) {
debug("Zero total distance");
if (verbose) {
printf("= %lld * 0 + %lld * 0\n", rails.r1, rails.r2);
}
return 1;
}
if (rails.r1 == 0 && rails.d % rails.r2 == 0) {
if (verbose) {
printf("= %lld * %lld + %lld * 0\n", rails.r1, rails.d / rails.r2,
rails.r2);
}
return 1;
}
if (rails.r2 == 0 && rails.d % rails.r1 == 0) {
if (verbose) {
printf("= %lld * 0 + %lld * %lld\n", rails.r1, rails.r2,
rails.d / rails.r1);
}
return 1;
}
eea_gcd_t eea = extended_euclidian_gcd(rails.r1, rails.r2);
lli g = eea.g;
if (rails.d % g != 0) {
return 0;
}
ld d_g = (ld)rails.d / (ld)g;
ld x0 = (ld)eea.x * d_g;
ld y0 = (ld)eea.y * d_g;
lli a_g = rails.r1 / g;
lli b_g = rails.r2 / g;
lli n_min = (lli)ceil(-x0 / (ld)b_g);
lli n_max = (lli)floor(y0 / (ld)a_g);
if (n_max < n_min) {
return 0;
}
variants += n_max - n_min + 1;
if (verbose) {
for (lli n = n_min; n <= n_max; n++) {
lli x = x0 + n * b_g;
lli y = y0 - n * a_g;
printf("= %lld * %lld + %lld * %lld\n", rails.r1, x, rails.r2, y);
}
}
return variants;
}
int main() {
printf("Delky koleji:\n");
lli rail_length_1 = -1, rail_length_2 = -1;
if (scanf(" %lld %lld", &rail_length_1, &rail_length_2) != 2 ||
(rail_length_1 <= 0 || rail_length_2 <= 0) ||
(rail_length_1 == rail_length_2)) {
return invalid_input();
}
printf("Vzdalenost:\n");
lli total_distance = 0;
char operand;
if (scanf(" %c %lld", &operand, &total_distance) != 2 ||
(operand != '+' && operand != '-')) {
return invalid_input();
}
if (total_distance < 0) {
return invalid_input();
}
lli variants = 0;
bool verbose = operand == '+';
if (rail_length_1 > 0 && rail_length_2 > 0) {
rails_t rails;
rails.r1 = rail_length_1;
rails.r2 = rail_length_2;
rails.d = total_distance;
variants += find_solutions(rails, verbose);
}
if (variants != 0) {
printf("Celkem variant: %lld\n", variants);
} else {
printf("Reseni neexistuje.\n");
}
}

View File

@ -1,2 +0,0 @@
10 13
+ 100

View File

@ -1,4 +0,0 @@
Delky koleji:
Vzdalenost:
= 10 * 10 + 13 * 0
Celkem variant: 1

View File

@ -1,4 +0,0 @@
Delky koleji:
Vzdalenost:
= 10 * 10 + 13 * 0
Celkem variant: 1

View File

@ -1,2 +0,0 @@
10 13
+ 749

View File

@ -1,9 +0,0 @@
Delky koleji:
Vzdalenost:
= 10 * 6 + 13 * 53
= 10 * 19 + 13 * 43
= 10 * 32 + 13 * 33
= 10 * 45 + 13 * 23
= 10 * 58 + 13 * 13
= 10 * 71 + 13 * 3
Celkem variant: 6

View File

@ -1,9 +0,0 @@
Delky koleji:
Vzdalenost:
= 10 * 32 + 13 * 33
= 10 * 19 + 13 * 43
= 10 * 6 + 13 * 53
= 10 * 71 + 13 * 3
= 10 * 58 + 13 * 13
= 10 * 45 + 13 * 23
Celkem variant: 6

View File

@ -1,2 +0,0 @@
10 13
+ 71

View File

@ -1,3 +0,0 @@
Delky koleji:
Vzdalenost:
Reseni neexistuje.

View File

@ -1,3 +0,0 @@
Delky koleji:
Vzdalenost:
Reseni neexistuje.

View File

@ -1,2 +0,0 @@
10 13
+ 0

View File

@ -1,4 +0,0 @@
Delky koleji:
Vzdalenost:
= 10 * 0 + 13 * 0
Celkem variant: 1

View File

@ -1,4 +0,0 @@
Delky koleji:
Vzdalenost:
= 10 * 0 + 13 * 0
Celkem variant: 1

View File

@ -1,2 +0,0 @@
54 16
+ 121

View File

@ -1,3 +0,0 @@
Delky koleji:
Vzdalenost:
Reseni neexistuje.

View File

@ -1,3 +0,0 @@
Delky koleji:
Vzdalenost:
Reseni neexistuje.

View File

@ -1,2 +0,0 @@
54 16
+ 2400

View File

@ -1,9 +0,0 @@
Delky koleji:
Vzdalenost:
= 54 * 16 + 16 * 96
= 54 * 8 + 16 * 123
= 54 * 0 + 16 * 150
= 54 * 40 + 16 * 15
= 54 * 32 + 16 * 42
= 54 * 24 + 16 * 69
Celkem variant: 6

View File

@ -1,9 +0,0 @@
Delky koleji:
Vzdalenost:
= 54 * 16 + 16 * 96
= 54 * 8 + 16 * 123
= 54 * 0 + 16 * 150
= 54 * 40 + 16 * 15
= 54 * 32 + 16 * 42
= 54 * 24 + 16 * 69
Celkem variant: 6

View File

@ -1,2 +0,0 @@
173 459
- 5219

Some files were not shown because too many files have changed in this diff Show More