Compare commits
No commits in common. "main" and "v3" have entirely different histories.
@ -7,4 +7,4 @@ validate_code:
|
|||||||
stage: test
|
stage: test
|
||||||
script:
|
script:
|
||||||
- chmod +x ./test/main.sh
|
- chmod +x ./test/main.sh
|
||||||
- ./test/main.sh --all --gitlab
|
- ./test/main.sh
|
||||||
|
@ -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 ::= '+' | '-' | '*' | '/'
|
|
||||||
```
|
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1 +0,0 @@
|
|||||||
3.5 + 1.5 =
|
|
@ -1,2 +0,0 @@
|
|||||||
Zadejte vzorec:
|
|
||||||
5
|
|
@ -1,2 +0,0 @@
|
|||||||
Zadejte vzorec:
|
|
||||||
5
|
|
@ -1 +0,0 @@
|
|||||||
3.5 / 1.5 =
|
|
@ -1,2 +0,0 @@
|
|||||||
Zadejte vzorec:
|
|
||||||
2
|
|
@ -1,2 +0,0 @@
|
|||||||
Zadejte vzorec:
|
|
||||||
2
|
|
@ -1 +0,0 @@
|
|||||||
1000000 * 1.5e+8 =
|
|
@ -1,2 +0,0 @@
|
|||||||
Zadejte vzorec:
|
|
||||||
1.5e+14
|
|
@ -1,2 +0,0 @@
|
|||||||
Zadejte vzorec:
|
|
||||||
1.5e+14
|
|
@ -1 +0,0 @@
|
|||||||
7 / -1 =
|
|
@ -1,2 +0,0 @@
|
|||||||
Zadejte vzorec:
|
|
||||||
-7
|
|
@ -1,2 +0,0 @@
|
|||||||
Zadejte vzorec:
|
|
||||||
-7
|
|
@ -1 +0,0 @@
|
|||||||
abc / 1 =
|
|
@ -1,2 +0,0 @@
|
|||||||
Zadejte vzorec:
|
|
||||||
Nespravny vstup.
|
|
@ -1,2 +0,0 @@
|
|||||||
Zadejte vzorec:
|
|
||||||
Nespravny vstup.
|
|
@ -1 +0,0 @@
|
|||||||
4 & 10 =
|
|
@ -1,2 +0,0 @@
|
|||||||
Zadejte vzorec:
|
|
||||||
Nespravny vstup.
|
|
@ -1,2 +0,0 @@
|
|||||||
Zadejte vzorec:
|
|
||||||
Nespravny vstup.
|
|
@ -1 +0,0 @@
|
|||||||
0.848905 * 0.783596 =
|
|
@ -1,2 +0,0 @@
|
|||||||
Zadejte vzorec:
|
|
||||||
0.66519856238
|
|
@ -1 +0,0 @@
|
|||||||
-3.5 / 1.5 =
|
|
@ -1,2 +0,0 @@
|
|||||||
Zadejte vzorec:
|
|
||||||
-2
|
|
@ -1 +0,0 @@
|
|||||||
0.984813 / 0.360992 =
|
|
@ -1,2 +0,0 @@
|
|||||||
Zadejte vzorec:
|
|
||||||
2
|
|
@ -1 +0,0 @@
|
|||||||
2 * 3
|
|
@ -1,2 +0,0 @@
|
|||||||
Zadejte vzorec:
|
|
||||||
Nespravny vstup.
|
|
@ -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.
|
|
||||||
```
|
|
@ -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;
|
|
||||||
}
|
|
@ -1,2 +0,0 @@
|
|||||||
0 0 5
|
|
||||||
0 10 5
|
|
@ -1,3 +0,0 @@
|
|||||||
Zadejte parametry kruznice #1:
|
|
||||||
Zadejte parametry kruznice #2:
|
|
||||||
Vnejsi dotyk, zadny prekryv.
|
|
@ -1,3 +0,0 @@
|
|||||||
Zadejte parametry kruznice #1:
|
|
||||||
Zadejte parametry kruznice #2:
|
|
||||||
Vnejsi dotyk, zadny prekryv.
|
|
@ -1,2 +0,0 @@
|
|||||||
0 0 3
|
|
||||||
1.5 1.5 0.8
|
|
@ -1,3 +0,0 @@
|
|||||||
Zadejte parametry kruznice #1:
|
|
||||||
Zadejte parametry kruznice #2:
|
|
||||||
Kruznice #2 lezi uvnitr kruznice #1, prekryv: 2.010619
|
|
@ -1,3 +0,0 @@
|
|||||||
Zadejte parametry kruznice #1:
|
|
||||||
Zadejte parametry kruznice #2:
|
|
||||||
Kruznice #2 lezi uvnitr kruznice #1, prekryv: 2.010619
|
|
@ -1,2 +0,0 @@
|
|||||||
0 0 4
|
|
||||||
2 0 2
|
|
@ -1,3 +0,0 @@
|
|||||||
Zadejte parametry kruznice #1:
|
|
||||||
Zadejte parametry kruznice #2:
|
|
||||||
Vnitrni dotyk, kruznice #2 lezi uvnitr kruznice #1, prekryv: 12.566371
|
|
@ -1,3 +0,0 @@
|
|||||||
Zadejte parametry kruznice #1:
|
|
||||||
Zadejte parametry kruznice #2:
|
|
||||||
Vnitrni dotyk, kruznice #2 lezi uvnitr kruznice #1, prekryv: 12.566371
|
|
@ -1,2 +0,0 @@
|
|||||||
0 0 5
|
|
||||||
100 100 10
|
|
@ -1,3 +0,0 @@
|
|||||||
Zadejte parametry kruznice #1:
|
|
||||||
Zadejte parametry kruznice #2:
|
|
||||||
Kruznice lezi vne sebe, zadny prekryv.
|
|
@ -1,3 +0,0 @@
|
|||||||
Zadejte parametry kruznice #1:
|
|
||||||
Zadejte parametry kruznice #2:
|
|
||||||
Kruznice lezi vne sebe, zadny prekryv.
|
|
@ -1,2 +0,0 @@
|
|||||||
0 0 4.5
|
|
||||||
10 10 15
|
|
@ -1,3 +0,0 @@
|
|||||||
Zadejte parametry kruznice #1:
|
|
||||||
Zadejte parametry kruznice #2:
|
|
||||||
Kruznice se protinaji, prekryv: 37.475800
|
|
@ -1,3 +0,0 @@
|
|||||||
Zadejte parametry kruznice #1:
|
|
||||||
Zadejte parametry kruznice #2:
|
|
||||||
Kruznice se protinaji, prekryv: 37.475800
|
|
@ -1,2 +0,0 @@
|
|||||||
-10.25 -20.5 4
|
|
||||||
-10.25 -20.5 4
|
|
@ -1,3 +0,0 @@
|
|||||||
Zadejte parametry kruznice #1:
|
|
||||||
Zadejte parametry kruznice #2:
|
|
||||||
Kruznice splyvaji, prekryv: 50.265482
|
|
@ -1,3 +0,0 @@
|
|||||||
Zadejte parametry kruznice #1:
|
|
||||||
Zadejte parametry kruznice #2:
|
|
||||||
Kruznice splyvaji, prekryv: 50.265482
|
|
@ -1 +0,0 @@
|
|||||||
0 0 -2
|
|
@ -1,2 +0,0 @@
|
|||||||
Zadejte parametry kruznice #1:
|
|
||||||
Nespravny vstup.
|
|
@ -1,2 +0,0 @@
|
|||||||
Zadejte parametry kruznice #1:
|
|
||||||
Nespravny vstup.
|
|
@ -1,2 +0,0 @@
|
|||||||
0 12 5
|
|
||||||
3 7 abc
|
|
@ -1,3 +0,0 @@
|
|||||||
Zadejte parametry kruznice #1:
|
|
||||||
Zadejte parametry kruznice #2:
|
|
||||||
Nespravny vstup.
|
|
@ -1,3 +0,0 @@
|
|||||||
Zadejte parametry kruznice #1:
|
|
||||||
Zadejte parametry kruznice #2:
|
|
||||||
Nespravny vstup.
|
|
@ -1,2 +0,0 @@
|
|||||||
9.7e-39 -1.85e-38 4.16e-38
|
|
||||||
4.03e-38 2.3e-39 4.6e-39
|
|
@ -1,3 +0,0 @@
|
|||||||
Zadejte parametry kruznice #1:
|
|
||||||
Zadejte parametry kruznice #2:
|
|
||||||
Vnitrni dotyk, kruznice #2 lezi uvnitr kruznice #1, prekryv: 0.000000
|
|
@ -1,2 +0,0 @@
|
|||||||
4.03e-38 2.3e-39 4.6e-39
|
|
||||||
9.7e-39 -1.85e-38 4.16e-38
|
|
@ -1,3 +0,0 @@
|
|||||||
Zadejte parametry kruznice #1:
|
|
||||||
Zadejte parametry kruznice #2:
|
|
||||||
Vnitrni dotyk, kruznice #1 lezi uvnitr kruznice #2, prekryv: 0.000000
|
|
@ -1,2 +0,0 @@
|
|||||||
-2.21e-38 -1.11e-38 1.4862e-36
|
|
||||||
1.2253e-36 5.721e-37 1.092e-37
|
|
@ -1,3 +0,0 @@
|
|||||||
Zadejte parametry kruznice #1:
|
|
||||||
Zadejte parametry kruznice #2:
|
|
||||||
Vnitrni dotyk, kruznice #2 lezi uvnitr kruznice #1, prekryv: 0.000000
|
|
@ -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.
|
|
@ -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");
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,2 +0,0 @@
|
|||||||
10 13
|
|
||||||
+ 100
|
|
@ -1,4 +0,0 @@
|
|||||||
Delky koleji:
|
|
||||||
Vzdalenost:
|
|
||||||
= 10 * 10 + 13 * 0
|
|
||||||
Celkem variant: 1
|
|
@ -1,4 +0,0 @@
|
|||||||
Delky koleji:
|
|
||||||
Vzdalenost:
|
|
||||||
= 10 * 10 + 13 * 0
|
|
||||||
Celkem variant: 1
|
|
@ -1,2 +0,0 @@
|
|||||||
10 13
|
|
||||||
+ 749
|
|
@ -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
|
|
@ -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
|
|
@ -1,2 +0,0 @@
|
|||||||
10 13
|
|
||||||
+ 71
|
|
@ -1,3 +0,0 @@
|
|||||||
Delky koleji:
|
|
||||||
Vzdalenost:
|
|
||||||
Reseni neexistuje.
|
|
@ -1,3 +0,0 @@
|
|||||||
Delky koleji:
|
|
||||||
Vzdalenost:
|
|
||||||
Reseni neexistuje.
|
|
@ -1,2 +0,0 @@
|
|||||||
10 13
|
|
||||||
+ 0
|
|
@ -1,4 +0,0 @@
|
|||||||
Delky koleji:
|
|
||||||
Vzdalenost:
|
|
||||||
= 10 * 0 + 13 * 0
|
|
||||||
Celkem variant: 1
|
|
@ -1,4 +0,0 @@
|
|||||||
Delky koleji:
|
|
||||||
Vzdalenost:
|
|
||||||
= 10 * 0 + 13 * 0
|
|
||||||
Celkem variant: 1
|
|
@ -1,2 +0,0 @@
|
|||||||
54 16
|
|
||||||
+ 121
|
|
@ -1,3 +0,0 @@
|
|||||||
Delky koleji:
|
|
||||||
Vzdalenost:
|
|
||||||
Reseni neexistuje.
|
|
@ -1,3 +0,0 @@
|
|||||||
Delky koleji:
|
|
||||||
Vzdalenost:
|
|
||||||
Reseni neexistuje.
|
|
@ -1,2 +0,0 @@
|
|||||||
54 16
|
|
||||||
+ 2400
|
|
@ -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
|
|
@ -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
|
|
@ -1,2 +0,0 @@
|
|||||||
173 459
|
|
||||||
- 5219
|
|
@ -1,3 +0,0 @@
|
|||||||
Delky koleji:
|
|
||||||
Vzdalenost:
|
|
||||||
Reseni neexistuje.
|
|
@ -1,3 +0,0 @@
|
|||||||
Delky koleji:
|
|
||||||
Vzdalenost:
|
|
||||||
Reseni neexistuje.
|
|
@ -1,2 +0,0 @@
|
|||||||
173 459
|
|
||||||
- 234875
|
|
@ -1,3 +0,0 @@
|
|||||||
Delky koleji:
|
|
||||||
Vzdalenost:
|
|
||||||
Celkem variant: 3
|
|
@ -1,3 +0,0 @@
|
|||||||
Delky koleji:
|
|
||||||
Vzdalenost:
|
|
||||||
Celkem variant: 3
|
|
@ -1,2 +0,0 @@
|
|||||||
22 33
|
|
||||||
* 12
|
|
@ -1,3 +0,0 @@
|
|||||||
Delky koleji:
|
|
||||||
Vzdalenost:
|
|
||||||
Nespravny vstup.
|
|
@ -1,3 +0,0 @@
|
|||||||
Delky koleji:
|
|
||||||
Vzdalenost:
|
|
||||||
Nespravny vstup.
|
|
@ -1 +0,0 @@
|
|||||||
10 abc
|
|
@ -1,2 +0,0 @@
|
|||||||
Delky koleji:
|
|
||||||
Nespravny vstup.
|
|
@ -1,2 +0,0 @@
|
|||||||
Delky koleji:
|
|
||||||
Nespravny vstup.
|
|
@ -1,2 +0,0 @@
|
|||||||
21 27
|
|
||||||
- 567
|
|
@ -1,3 +0,0 @@
|
|||||||
Delky koleji:
|
|
||||||
Vzdalenost:
|
|
||||||
Celkem variant: 4
|
|
@ -1,2 +0,0 @@
|
|||||||
121 121
|
|
||||||
- 3878
|
|
@ -1,2 +0,0 @@
|
|||||||
Delky koleji:
|
|
||||||
Nespravny vstup.
|
|
@ -1,2 +0,0 @@
|
|||||||
0 0
|
|
||||||
- 150
|
|
@ -1,2 +0,0 @@
|
|||||||
Delky koleji:
|
|
||||||
Nespravny vstup.
|
|
@ -1,2 +0,0 @@
|
|||||||
13 15
|
|
||||||
+ -25
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user