109 lines
2.1 KiB
Markdown
109 lines
2.1 KiB
Markdown
# Problem RL - рекурсия в цикл
|
||
|
||
Ниже приведён исходный код программы для рекурсивного алгоритма Евклида.
|
||
|
||
**Ваша задача**: переписать его так, чтобы вместо рекурсии использовался цикл
|
||
|
||
Посылка должна состоять из программы, считывающей со стандартного ввода два числа `x` и `y` и выводящей на стандартный вывод одно число `g`
|
||
|
||
## Пример 1
|
||
|
||
| Ввод | Вывод |
|
||
| --------------- | --------------- |
|
||
| `2 1` | `1` |
|
||
|
||
## Пример 2
|
||
|
||
| Ввод | Вывод |
|
||
| --------------- | --------------- |
|
||
| `3 2` | `1` |
|
||
|
||
## Пример 3
|
||
|
||
| Ввод | Вывод |
|
||
| --------------- | --------------- |
|
||
| `2 4` | `2` |
|
||
|
||
## Примечания
|
||
|
||
```c
|
||
#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;
|
||
}
|
||
```
|
||
|
||
# Решение
|
||
|
||
```c
|
||
#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;
|
||
}
|
||
```
|