Согласие на обработку персональных данных.

17.09.2018
Новая задача Как определить порядковый номер символа.

07.09.2018
Новый выпуск журнала Автоматизация и программирование.

26.08.2018
Новые видео и статья Как закрепить окна в IDE Lazarus.

18.08.2018
Новая задача Сколько слайдов поместится в песню.

17.08.2018
Новый раздел: Этюды для программистов.



Раздел: Задачи / Простейшие /

Найти сумму делителей натурального числа

Условие задачи 2.16

Задача 2.16
Дано натуральное число N. Вывести на экран сумму его делителей. Число 1 считается делителем любого натурального числа. Число N не является делителем числа N.

Эту задачу довольно часто задают в контрольных и прочих студенческих делах. Задача несложная. Однако на её примере начинающие могут кое-чему научиться.

Алгоритм решения довольно простой:

  1. Перебираем в цикле все возможные целые числа от 1 до числа N.
  2. Каждый раз пытаемся делить число N на текущее число. Если оно делится без остатка, то текущее число является делителем числа N. Прибавляем его к итоговой сумме.

Разумеется, сначала подготавливаем необходимые переменные.

Ну а чтобы задачка была поинтереснее, предлагаю дополнительно сделать так, чтобы на экран была выведена не только итоговая сумма делителей числа N, но и сами делители.

Решения на Паскале и С++ представлены ниже. Если кто забыл, что такое натуральное число, то см. здесь.

Краткое описание программы:

  1. Обнуляем переменную Sum, в которой у нас будет итоговая сумма делителей.
  2. Получаем случайное значение и записываем его в переменную N.
  3. Затем запускаем цикл от 1 до N и в каждой итерации цикла вызываем нашу функцию ThisDivider(N, i), которая возвращает TRUE, если число i является делителем числа N. Саму функцию описывать не буду, потому что она достаточно простая.
  4. Если число i является делителем числа N, то к переменной Sum мы прибавляем число i, а к строке Str присоединяем строковое представление числа i, предварительно преобразовав это число в строку. Так мы получаем строку, которая содержит все делители числа N.
  5. Ну и в конце выводим всё на экран.

Обратите внимание, что для использования функции преобразования числа в строку в Паскале надо подключить модуль SysUtils, а в С++ - .

Также обратите внимание на то, как мы преобразуем число в строку на С++. Делается это довольно замысловато. И это ещё не самый сложный способ. В Паскале же всё просто и интуитивно понятно. Ну а в С++, как всегда, всё через зад.

Правда, начиная со стандарта С++ 2011 года (вроде с него), появилась более понятная и приятная функция to_string(). Но плохая новость заключается в том, что далеко не все средства разработки (особенно бесплатные) поддерживают этот стандарт. Поэтому я не стал использовать эту функцию в своей программе.

Решение задачи 2.16 на Паскале
program t216;

uses SysUtils;                 //Подключить этот модуль

//****************************************************************
// ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ
//****************************************************************
var
  i   : WORD;                  //Индекс
  N   : WORD;                  //Число
  Sum : DWORD = 0;             //Сумма
  Str : string = '';           //Строка для делителей

//****************************************************************
// ФУНКЦИИ И ПРОЦЕДУРЫ
//****************************************************************

//****************************************************************
// Функция принимает число и возможный делитель.
// ВХОД:  Num - число
//        Del - возможный делитель
// ВЫХОД: TRUE - если Del является делителем числа Num
//****************************************************************
function ThisDivider(Num, Del : WORD) : boolean;
begin
  if Del = Num then
    begin
      Result := FALSE;
      Exit;
    end;
  Result := (Num mod Del) = 0;
end;

//****************************************************************
// ОСНОВНАЯ ПРОГРАММА
//****************************************************************
begin
  Randomize;               //Запустить генерацию случайных чисел
  N := Random(High(N));    //Получить случайное число

  WriteLn('N = ', N);

  for i := 1 to N do       //В цикле проверить возможные делители
    begin
      if ThisDivider(N, i) then  //Если это делитель, то
        begin
          Sum := Sum + i;        //прибавить его к сумме
          Str := Str + IntToStr(i) + ' ';
        end;
    end;

  //Вывести на экран
  WriteLn('Dividers : ', Str);
  WriteLn('Sum of the divisors = ', Sum);

  WriteLn('The end. Press ENTER...');
  ReadLn;
end.     
Решение задачи 2.16 на С++
#include <cstdlib>
#include <iostream>
#include <sstream>                    //Подключить этот файл

using namespace std;

//****************************************************************
// ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ
//****************************************************************
unsigned short int N;                  //Число
unsigned long int  Sum = 0;            //Сумма
ostringstream      Str;                //Строка для делителей 

//****************************************************************
// ФУНКЦИИ И ПРОЦЕДУРЫ
//****************************************************************

//****************************************************************
// Функция принимает число и возможный делитель.
// ВХОД:  Num - число
//        Del - возможный делитель
// ВЫХОД: TRUE - если Del является делителем числа Num
//****************************************************************
bool ThisDivider(unsigned short int Num, unsigned short int Del)
{
  if (Del == Num) return(false);
  return(0 == (Num % Del));
}     

//****************************************************************
// ОСНОВНАЯ ПРОГРАММА
//****************************************************************
int main(int argc, char *argv[])
{
  srand(time(0));            //Запустить генерацию случайных чисел
  N = rand() % USHRT_MAX;    //Получить случайное число
  
  Str.clear();
  
  cout << "N = " << N << endl;
  for(int i = 1; i <= N; i++)
  {
    if (ThisDivider(N, i))
    {      
      Str << i << ' ';
      Sum = Sum + i;
    }
  }
  
  //Вывести на экран
  cout << "Dividers : " << Str.str() << endl;
  cout << "Sum of the divisors = " << Sum << endl;     
  
  system("PAUSE");
  return EXIT_SUCCESS;
}

Найти сумму делителей натурального числа


Основы C++ Основы C++

C++ - это один из самых популярных языков программирования. Не важно, на каком языке программируете лично вы. Но, если вы хотя бы в общих чертах не знаете С++, то это большой пробел в вашем образовании, который надо восполнить как можно быстрее... Подробнее...
Инфо-МАСТЕР ®
Все права защищены ©
e-mail: mail@info-master.su

Яндекс.Метрика