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

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

Основы программирования 2.0 Основы программирования
Каждый профессионал когда-то был чайником. Наверняка вам знакомо состояние, когда “не знаешь как начать думать, чтобы до такого додуматься”. Наверняка вы сталкивались с ситуацией, когда вы просто не знаете, с чего начать. Эта книга ориентирована как раз на таких людей, кто хотел бы стать программистом, но совершенно не знает, как начать этот путь. Подробнее...

Условие задачи 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;
}

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


Как стать программистом 2.0 Как стать программистом 2.0

Эта книга для тех, кто хочет стать программистом. На самом деле хочет, а не просто мечтает. И хочет именно стать программистом с большой буквы, а не просто научиться кулебякать какие-то примитивные программки… Подробнее...
Помощь в технических вопросах Помощь в технических вопросах

Помощь студентам. Курсовые, дипломы, чертежи (КОМПАС), задачи по программированию: Pascal/Delphi/Lazarus; С/С++; Ассемблер; языки программирования ПЛК; JavaScript; VBScript; Fortran; Python и др. Разработка (доработка) ПО ПЛК (предпочтение - ОВЕН, CoDeSys 2 и 3), а также программирование панелей оператора, программируемых реле и других приборов систем автоматизации. Подробнее...

Инфо-МАСТЕР ®
Все права защищены ©
e-mail: mail@info-master.su

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