Определить сумму сумм простых множителей - 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;
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.071 из 5
Похожие ответы