Раздел: Задачи / Простейшие /
Найти сумму делителей натурального числа
 
 | 
Основы программирования Каждый профессионал когда-то был чайником. Наверняка вам знакомо состояние, когда “не знаешь как начать думать, чтобы до такого додуматься”. Наверняка вы сталкивались с ситуацией, когда вы просто не знаете, с чего начать. Эта книга ориентирована как раз на таких людей, кто хотел бы стать программистом, но совершенно не знает, как начать этот путь. Подробнее...  | 
Условие задачи 2.16
Задача 2.16
Дано натуральное число N. Вывести на экран сумму его делителей. Число 1 считается делителем любого натурального числа. Число N не является делителем числа N.
Эту задачу довольно часто задают в контрольных и прочих студенческих делах. Задача несложная. Однако на её примере начинающие могут кое-чему научиться.
Алгоритм решения довольно простой:
- Перебираем в цикле все возможные целые числа от 1 до числа N.
 - Каждый раз пытаемся делить число N на текущее число. Если оно делится без остатка, то текущее число является делителем числа N. Прибавляем его к итоговой сумме.
 
Разумеется, сначала подготавливаем необходимые переменные.
Ну а чтобы задачка была поинтереснее, предлагаю дополнительно сделать так, чтобы на экран была выведена не только итоговая сумма делителей числа N, но и сами делители.
Решения на Паскале и С++ представлены ниже. Если кто забыл, что такое натуральное число, то см. здесь.
Краткое описание программы:
- Обнуляем переменную Sum, в которой у нас будет итоговая сумма делителей.
 - Получаем случайное значение и записываем его в переменную N.
 - Затем запускаем цикл от 1 до N и в каждой итерации цикла вызываем нашу функцию ThisDivider(N, i), которая возвращает TRUE, если число i является делителем числа N. Саму функцию описывать не буду, потому что она достаточно простая.
 - Если число i является делителем числа N, то к переменной Sum мы прибавляем число i, а к строке Str присоединяем строковое представление числа i, предварительно преобразовав это число в строку. Так мы получаем строку, которая содержит все делители числа N.
 - Ну и в конце выводим всё на экран.
 
Обратите внимание, что для использования функции преобразования числа в строку в Паскале надо подключить модуль SysUtils, а в С++ - 
Также обратите внимание на то, как мы преобразуем число в строку на С++. Делается это довольно замысловато. И это ещё не самый сложный способ. В Паскале же всё просто и интуитивно понятно. Ну а в С++, как всегда, всё через зад.
Правда, начиная со стандарта С++ 2011 года (вроде с него), появилась более понятная и приятная функция to_string(). Но плохая новость заключается в том, что далеко не все средства разработки (особенно бесплатные) поддерживают этот стандарт. Поэтому я не стал использовать эту функцию в своей программе.
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.
#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
   Эта книга для тех, кто хочет стать программистом. На самом деле хочет, а не просто мечтает. И хочет именно стать программистом с большой буквы, а не просто научиться кулебякать какие-то примитивные программки… Подробнее...  | 
  
  
   
  
   | 
  
  Помощь в технических вопросах
   Помощь студентам. Курсовые, дипломы, чертежи (КОМПАС), задачи по программированию: Pascal/Delphi/Lazarus; С/С++; Ассемблер; языки программирования ПЛК; JavaScript; VBScript; Fortran; Python и др. Разработка (доработка) ПО ПЛК (предпочтение - ОВЕН, CoDeSys 2 и 3), а также программирование панелей оператора, программируемых реле и других приборов систем автоматизации. Подробнее...  |