Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- float fRes; // Будет максимально приближаться (слева) к 3/7
- int k_Res,
- p_Res;
- int test(int); // Тестирует функцию "checking_the_correct_fraction()"
- // несколькими предопределёнными дробями.
- // Если дроби все правильные, то возвращает 1 (один)
- // Если хотя бы одна неправильная, то вернёт 0 (ноль)
- // Возвращает:
- // = 0, если дробь неправильная
- // = 1, если правильная
- int checking_the_correct_fraction(int k, int p);
- // Ищет все правильные дроби со знаменателем >= n
- void Enumeration(int n);
- ////////////////////////////////////////////////////
- int main() //
- {
- // if(test(2) == 1) printf("Test. All fractions are correct. \n"); // Удалить после тестирования ф-ции.
- // else printf("Test. Not all fractions are correct !!! \n"); // Удалить после тестирования ф-ции.
- printf("We print all the correct fractions up to the denominator equal to 8.\n");
- printf("In ascending order of the denominator.\n");
- Enumeration(8);
- printf("In the list above, the fraction closest to 3/7 on the left is:\n%d/%d = %.3f \n",
- k_Res, p_Res, fRes);
- Enumeration(800);
- printf("If the denominator reaches 800, the fraction closest to 3/7 on the left is:\n%d/%d = %.3f \n",
- k_Res, p_Res, fRes);
- Enumeration(10000);
- printf("If the denominator reaches 10 000, the fraction closest to 3/7 on the left is:\n%d/%d = %.3f \n",
- k_Res, p_Res, fRes);
- }
- float _f; // частное (вещественное число)
- ////////////////////////////////////////////////////
- void the_closest_one_on_the_left(int k, int p) //
- {
- if(_f > fRes )
- if(_f < 0.428)
- {
- fRes = _f;
- k_Res = k;
- p_Res = p;
- }
- }
- // Ищет все правильные дроби со знаменателем >= n
- ////////////////////////////////////////////////////
- void Enumeration(int n) //
- {
- float fk, // числитель (вещественное число)
- fp; // знаменатель (вещественное число)
- fRes = 0; // Будет максимально приближаться (слева) к 3/7
- for(int p = 2; p <= n; p++) // Знаменатели переберём по возрастанию
- for(int k = 2; k < n; k++) // Перебор числителей
- {
- if(checking_the_correct_fraction(k, p) == 1) // Если очередная дробь правильная...
- {
- fk = k;
- fp = p;
- _f = fk/fp;
- the_closest_one_on_the_left(k, p);
- if(n < 10) printf("%d/%d = %.3f\n", k, p, _f); // Печатаем список всех дробей, если знаменатель < 10
- }
- }
- }
- // Возвращает:
- // = 0, если дробь неправильная
- // = 1, если правильная
- //////////////////////////////////////////////////// k - это числитель
- int checking_the_correct_fraction(int k, int p) // p - знаменатель
- {
- if(k >= p) return 0; // Числитель не меньше знаменателя
- while (p > 0)
- {
- int c = k % p; // Алгоритм Евклида (НОД)
- k = p;
- p = c;
- }
- if(k != 1) return 0; // Есть общий множитель больше 1 (единицы)
- return 1;
- }
- // Тестирует функцию "checking_the_correct_fraction()"
- // несколькими предопределёнными дробями.
- // Если дроби все правильные, то возвращает 1 (один)
- // Если хотя бы одна неправильная, то вернёт 0 (ноль)
- //////////////////////////////////////////////////////////////////////
- int test(int n) //
- {
- switch(n)
- {
- case 1: // Есть неправильные дроби
- if(checking_the_correct_fraction( 2, 5) == 0) return 0;
- if(checking_the_correct_fraction( 3, 7) == 0) return 0;
- if(checking_the_correct_fraction(13, 14) == 0) return 0;
- if(checking_the_correct_fraction(19, 20) == 0) return 0;
- if(checking_the_correct_fraction( 2, 6) == 0) return 0;
- if(checking_the_correct_fraction( 3, 9) == 0) return 0;
- if(checking_the_correct_fraction(13, 26) == 0) return 0;
- if(checking_the_correct_fraction( 5, 20) == 0) return 0;
- return 1;
- case 2: // Все дроби правильные
- if(checking_the_correct_fraction( 2, 5) == 0) return 0;
- if(checking_the_correct_fraction( 3, 7) == 0) return 0;
- if(checking_the_correct_fraction(13, 14) == 0) return 0;
- if(checking_the_correct_fraction(19, 20) == 0) return 0;
- if(checking_the_correct_fraction( 5, 7) == 0) return 0;
- if(checking_the_correct_fraction(13, 14) == 0) return 0;
- if(checking_the_correct_fraction(15, 26) == 0) return 0;
- if(checking_the_correct_fraction( 5, 19) == 0) return 0;
- return 1;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement