Разбор
Количество правильных несократимых дробей (со знаменателем ) равно количеству таких натуральных чисел , что и взаимно просто с . Такое количество чисел равно функции Эйлера .
Пример
При имеются правильные несократимые дроби:
Реализация алгоритма
Функция euler вычисляет значение .
int euler(int n) { int i, result = n; for (i = 2; i * i <= n; i++) { if (n % i == 0) result -= result / i; while (n % i == 0) n /= i; } if (n > 1) result -= result / n; return result; }
Основная часть программы. Читаем входное значение и выводим .
while(scanf("%d",&n),n) printf("%d\n",euler(n));
Java реализация
import java.util.Scanner; public class Main { static int euler(int n) { int result = n; for(int i = 2; i * i <= n;i++) { if (n % i == 0) result -= result / i; while (n % i == 0) n /= i; } if (n > 1) result -= result / n; return result; } public static void main(String[] args) { Scanner con = new Scanner(System.in); while(con.hasNext()) { int n = con.nextInt(); if (n == 0) break; System.out.println(euler(n)); } con.close(); } }
Python реализация
import math
Функция euler вычисляет значение .
def euler(n): result = n i = 2 while i <= math.isqrt(n): if n % i == 0: result -= result // i while n % i == 0: n //= i i += 1 if n > 1: result -= result // n return result
Основная часть программы. Читаем входное значение и выводим .
while True: n = int(input()) if n == 0: break print(euler(n))