add task 2

This commit is contained in:
2026-01-29 15:14:28 +05:00
parent 2eaca8fc1c
commit 99ea748a16
2 changed files with 109 additions and 0 deletions

102
1. problem_rl/solution.c Normal file
View File

@@ -0,0 +1,102 @@
/*
Problem RL -- рекурсия в цикл
Ниже приведён исходный код программы для рекурсивного алгоритма Евклида.
Ваша задача: переписать его так, чтобы вместо рекурсии использовался цикл
Посылка должна состоять из программы, считывающей со стандартного ввода два числа x и y и выводящей на стандартный вывод одно число g
Пример 1
Ввод: 2 1
Вывод: 1
Пример 2
Ввод: 3 2
Вывод: 1
Пример 3
Ввод: 2 4
Вывод: 2
Примечания
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
unsigned long long gcd(unsigned long long x,
unsigned long long y) {
unsigned long long q;
if (y > x)
return gcd(y, x);
assert (y > 0);
q = x % y;
if (q == 0)
return y;
return gcd(y, q);
}
int main() {
unsigned long long x = 0, y = 0, g;
int res;
res = scanf("%llu %llu", &x, &y);
assert(res == 2);
g = gcd(x, y);
printf("%llu\n", g);
return 0;
}
*/
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#define ull unsigned long long
#define ll long long
ull gcd_cycle(ll x, ll y);
ull gcd_recursive(ull x, ull y);
int main() {
ull x = 0, y = 0, g;
int res;
res = scanf("%llu %llu", &x, &y);
assert(res == 2);
g = gcd_cycle(x, y);
printf("%llu\n", g);
return 0;
}
ull gcd_recursive(ull x, ull y) {
ull q;
if (y > x)
return gcd_recursive(y, x);
assert (y > 0);
q = x % y;
if (q == 0)
return y;
return gcd_recursive(y, q);
}
ull gcd_cycle(ll x, ll y) {
x = llabs(x);
y = llabs(y);
if (x == 0) return y;
if (y == 0) return x;
while (y != 0) {
ll r = x % y;
x = y;
y = r;
}
return x;
}

View File

@@ -0,0 +1,7 @@
here i've got various tasks (w/ solutions) from C contest
| **Number** | **Name** | **Solution** |
| ---------- | -------- | ------------ |
| 1 | *problem_rl* | [C](1.%20problem_rl/solution.c) |