Определить сумму сумм простых множителей - C (СИ)
Формулировка задачи:
Дана целочисленная таблица a[1. M]. Среди ее элементов есть хотя бы один отрицательный. Больше ли сумма сумм простых множителей элементов идущих после
#include <stdio.h>
#include <conio.h>
#define M 10
int sum_factor(int x) /* здесь находится сумма простых множителей */
{
int cnt, s = 0, i = 2;
while(i < x / 2)
{
for(cnt = 0; (x > 1) && (x % i == 0); x /= i)
cnt += 1;
if(cnt) s += i;
i += (i == 2 ? 1 : 2);
}
if(x > 1) s += x;
return s;
}
int main() {
int L = 20, s = 0, i;
int a[M] = {1, 21, 35, 42, 15, 46, -72, 178, 29, 10};
for(i = 0; a[i] > 0; i++);
for(i = i + 1; i < M; i++)
s += sum_factor(a[i]);
printf("Сумма сумм простых множителей (%d) %s меньше L = %d\n",
s, (s < L ? "" : "не"), L);
return 0;
}
помогите написать комментарий к этому коду плиз)
Решение задачи: «Определить сумму сумм простых множителей»
textual
Листинг программы
#include <stdio.h>
#include <conio.h>
#define M 10
int sum_factor(int x) /* здесь находится сумма простых множителей */
{
int cnt, s = 0, i = 2;
/* Ищем все множители числа X. Начинаем с двойки
(выше i = 2 для этого), заканчиваем - когда дойдем
до множителя, равного X/2 */
while(i < x / 2)
{
/* Для каждого ВОЗМОЖНОГО множителя проверяем,
действительно ли это множитель числа X (т.е.,
делится ли X на i без остатка). Если делится,
то продолжаем делить, пока остаток = 0 и пока
частное от деления (новое значение X) больше
единицы*/
for(cnt = 0; (x > 1) && (x % i == 0); x /= i)
cnt += 1; /* Подсчитываем количество успешных делений*/
/* Если cnt > 0, то i является делителем X,
увеличиваем сумму на этот самый делитель */
if(cnt) s += i;
/* Находим следующий ВОЗМОЖНЫЙ делитель. Если
текущее значение i равно 2, то увеличиваем его
на 1 (т. к. следующее после 2 простое число = 3),
иначе (если i уже больше 2) увеличиваем на 2,
все остальные простые числа - нечетные, четные
нет смысла проверять, будет делаться пустая работа*/
i += (i == 2 ? 1 : 2);
}
/* Последний делитель добавляем к сумме делителей
(т.е, к примеру, было число 50, оно разделилось на
2, еще раз на 2, X стал равным 5, и на следующем шаге
i = 3, и 3 уже больше, чем X/2, выходим из цикла.
Вот оставшаяся 5-ка это и есть неучтенный делитель,
его тоже добавляем к сумме)
*/
if(x > 1) s += x;
return s; /* Ну, и возвращаем найденную сумму делителей*/
}
int main() {
int L = 20, s = 0, i;
int a[M] = {1, 21, 35, 42, 15, 46, -72, 178, 29, 10};
/* Здесь небольшая неточность, это будет работать
на приведенных данных, но это не совсем по условию.
Тут находится ПЕРВОЕ отрицательное число, а нужно
ПОСЛЕДНЕЕ, то есть, надо от конца массива идти
к началу : for(i = M - 1; i >= 0 && a[i] > 0; i--);
*/
for(i = 0; a[i] > 0; i++);
/* А теперь проходим от следующего за последним
отрицательным элемента до конца и подсчитываем для
элементов сумму СУММ ПРОСТЫХ МНОЖИТЕЛЕЙ (т.е., сумму
значений функции sum_factor)*/
for(i = i + 1; i < M; i++)
s += sum_factor(a[i]);
/* Чтобы не делать лишних if-ов, я решил
воспользоваться тернарным оператором. Код, который
приведен ниже, аналогичен следующему:
if(s < L)
printf("Сумма сумм простых множителей (%d) %s меньше L = %d\n", s, "", L);
else
printf("Сумма сумм простых множителей (%d) %s меньше L = %d\n", s, "не", L);
*/
printf("Сумма сумм простых множителей (%d) %s меньше L = %d\n",
s, (s < L ? "" : "не"), L);
return 0;
}