Определить сумму сумм простых множителей - 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; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д