Найти сумму дробей с нечетными порядковыми номерами - C (СИ)
Формулировка задачи:
Создать программу, вводящую в цикле несколько дробей (не более заданного количества N), и находящую для введенных дробей две суммы: сумму дробей с нечетными порядковыми номерами и сумму дробей с четными номерами. Программа заканчивает работу, когда сумма дробей с четными номерами окажется больше, чем с нечетными. Нужна помощь
Решение задачи: «Найти сумму дробей с нечетными порядковыми номерами»
textual
Листинг программы
#include <stdio.h>
int grecomdiv(int a, int b)
{
if(a < 0)
a *= -1;
if(b < 0)
b *= -1;
int low, gcd = 1, i = 2;
low = a < b ? a : b;
while(i <= low){
if(a % i == 0 && b % i == 0){
gcd = gcd * i;
a = a / i;
b = b / i;
}
else
i++;
}
return gcd;
}
int main()
{
double S1 = 0.0, S2 = 0.0;
int a1, b1, c1, d1, a2, b2, c2, d2, x1, y1, x2, y2, gcd, N, i, sx1 = 0, sy1 = 1, sx2 = 0, sy2 = 1;
puts("Enter the number of pairs of simple fractions:");
scanf("%d", &N);
for(i = 1; i <= N; i++){
puts("Type the numerator and denominator by a space:");
scanf("%d%d", &a1, &b1);
printf("You have entered an odd fraction: %d/%d\n", a1, b1);
puts("Type the numerator and denominator by a space:");
scanf("%d%d", &a2, &b2);
printf("You have entered an even fraction: %d/%d\n", a2, b2);
puts("Type the numerator and denominator by a space:");
scanf("%d%d", &c1, &d1);
printf("You have entered an odd fraction: %d/%d\n", c1, d1);
puts("Type the numerator and denominator by a space:");
scanf("%d%d", &c2, &d2);
printf("You have entered an even fraction: %d/%d\n", c2, d2);
x1 = a1 * d1 + b1 * c1;
y1 = b1 * d1;
x2 = a2 * d2 + b2 * c2;
y2 = b2 * d2;
gcd = grecomdiv(x1, y1);
x1 /= gcd;
y1 /= gcd;
gcd = grecomdiv(x2, y2);
x2 /= gcd;
y2 /= gcd;
sx1 = sx1 * y1 + sy1 * x1;
sy1 = sy1 * y1;
gcd = grecomdiv(sx1, sy1);
sx1 /= gcd;
sy1 /= gcd;
sx2 = sx2 * y2 + sy2 * x2;
sy2 = sy2 * y2;
gcd = grecomdiv(sx2, sy2);
sx2 /= gcd;
sy2 /= gcd;
S1 += (double)sx1 / sy1;
S2 += (double)sx2 / sy2;
if(S2 > S1){
puts("Even fractions amount greater than the sum of odd");
break;
}
}
if(sx1 > sy1)//если числитель больше знаменателя
printf("Sum of the odd fractions is: %d %d/%d\n", sx1 / sy1, sx1 % sy1, sy1);//выводим целую и дробную части
else
printf("Sum of the odd fractions is: %d/%d\n", sx1, sy1);
if(sx2 > sy2)
printf("Sum of the even fractions is: %d %d/%d\n", sx2 / sy2, sx2 % sy2, sy2);
else
printf("Sum of the even fractions is: %d/%d\n", sx2, sy2);
return 0;
}
Объяснение кода листинга программы
- Заголовочный файл #include
подключает функции ввода-вывода из стандартной библиотеки - Функция grecomdiv(int a, int b) находит наибольший общий делитель (НОД) для чисел a и b, используя алгоритм Евклида
- Переменная low инициализируется значением a в функции main(), если a меньше b, и b в противном случае
- Переменная gcd инициализируется единицей в функции main()
- Переменные i, sx1 и sy1 инициализируются нулями в функции main()
- Переменные a1, b1, c1, d1, a2, b2, c2, d2, x1, y1, x2, y2 и N инициализируются нулями в функции main()
- Цикл for в функции main() выполняется N раз, где N - количество пар простых дробей, введенных пользователем
- В каждой итерации цикла пользователь вводит значения a1, b1, c1, d1, a2, b2, c2, d2 с помощью функции scanf()
- Значения a1, b1, c1, d1 преобразуются в типы int, а значения a2, b2, c2, d2 - в типы double с плавающей точкой
- Выполняются вычисления для первой и второй дробей с использованием функций grecomdiv() и операций деления и умножения
- Переменные sx1 и sy1 обновляются значениями x1 и y1 соответственно
- Переменные sx2 и sy2 обновляются значениями x2 и y2 соответственно
- Переменная S1 обновляется значением sx1/sy1, а переменная S2 - значением sx2/sy2
- Если S2 больше S1, то выводится сообщение
Even fractions amount greater than the sum of oddи цикл прерывается - Если sx1 больше sy1, то выводится сообщение
Sum of the odd fractions is: sx1 / sy1, sx1 % sy1, sy1 - Если sx2 больше sy2, то выводится сообщение
Sum of the even fractions is: sx2 / sy2, sx2 % sy2, sy2 - Функция main() возвращает 0, что означает успешное выполнение программы