Печать идеальных чисел между определенным интервалом

// starting, end,  number, sum of the divisor, delimiter 
int pocetok, kraj, broj,   zbir_na_deliteli=0, delitel=1;
printf("Vnesi go intervalot: ");  // Enter the interval
scanf("%d%d", &pocetok, &kraj);

for(broj=pocetok;broj<=kraj;broj++)
    for(;delitel<broj;delitel++){
        if (broj%delitel==0)
            zbir_na_deliteli+=delitel;
    }
    if (zbir_na_deliteli==broj)
        // The number %d is a perfect number
        printf("Brojot %d e sovrshen broj\n", broj);
    }

Это программа, которую я написал. Я буквально сравниваю это построчно с решенной программой, которая делает то же самое, за исключением того, что одна работает, а эта - нет.

Может кто-нибудь объяснить мне, что я делаю не так?

Возможно, отсутствует delitel = 1; внутри цикла?

pmg 26.10.2018 22:50

Попробуйте for(;delitel<broj;delitel++){ -> for(int delitel = 1;delitel<broj;delitel++){

chux - Reinstate Monica 26.10.2018 22:51

Нет, инициализируется в первой строке. Необязательно быть там, где должно быть начальное значение в цикле for. Я не получаю сообщение об ошибке ether. @pmg

ptushev 26.10.2018 22:52

Да, это необходимо, потому что вы делаете zbir_na_deliteli+=delitel. Почему не только zbir_na_deliteli++ ?? Возможно, я неправильно понимаю, что вы пытаетесь вычислить, поскольку я не знаю, что означают ваши имена переменных. Похоже, вы просто пытаетесь их сосчитать. Но в вашем вопросе написано «распечатайте числа». Вы печатаете что-то только один раз, после всех циклов. Возможно вам не хватает {}

paddy 26.10.2018 22:53

zbir_na_deliteli + = delitel - суммирование знаменателей числа. Я не могу их суммировать, если увеличиваю их на 1 @paddy

ptushev 26.10.2018 22:58

Так, тогда не следует ли каждый раз устанавливать значение 1 перед внутренним циклом?

paddy 26.10.2018 22:59

Шпионское ПО, Отсутствует делитель = 1; внутри петли относится к delitel = 1; внутри for(broj=pocetok...., а не к for(;delitel<broj....

chux - Reinstate Monica 26.10.2018 23:00

@chux я думал, что вы не можете объявлять переменные внутри цикла for в c. По крайней мере, так сказал мой профессор колледжа.

ptushev 26.10.2018 23:00

Вам не нужно объявлять это там. Вам просто нужно установить значение. for(delitel=1;delitel<broj;delitel++)

paddy 26.10.2018 23:00

Шпионское ПО, какую ошибку компилятора или результат выполнения вы получили с for(int delitel = 1;delitel<broj;delitel++){?

chux - Reinstate Monica 26.10.2018 23:01

Шпионское ПО: «вы не можете объявлять переменные внутри цикла for в c.» Не подходит для кода до C99. Хорошо, чтобы делать это последние 19 лет.

chux - Reinstate Monica 26.10.2018 23:03

@chux, я не получаю сообщения об ошибке. Программа выполняется, но после того, как я ввожу начальное и конечное значение, она ничего не распечатывает. Я поместил свой delitel = 1 в цикл for, как вы сказали.

ptushev 26.10.2018 23:09

"но после того, как я ввожу начальное и конечное значение" -> почему секретность? Какие входные значения, какой выход ожидался?

chux - Reinstate Monica 26.10.2018 23:17
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
13
48
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Can someone explain to me what am I doing wrong?

Счетчик delitel необходимо перезапускать по 1 в каждом цикле.

    // for(;delitel<broj;delitel++){
    for (int delitel = 1; delitel < broj; delitel++) {

Сумма zbir_na_deliteli должна быть сброшена на 0 в каждом цикле.

  for (int broj = pocetok; broj <= kraj; broj++) {
    int zbir_na_deliteli = 0;

Образец кода:

void Printing_out_the_perfect_numbers(int pocetok, int kraj) {
  for (int broj = pocetok; broj <= kraj; broj++) {
    int zbir_na_deliteli = 0;
    for (int delitel = 1; delitel < broj; delitel++) {
      if (broj % delitel == 0) {
        zbir_na_deliteli += delitel;
      }
    }
    if (zbir_na_deliteli == broj) {
      printf("Brojot %d e sovrshen broj\n", broj);
    }
  }
}

int main() {
  Printing_out_the_perfect_numbers(1, 10000);
}

Выход

Brojot 6 e sovrshen broj
Brojot 28 e sovrshen broj
Brojot 496 e sovrshen broj
Brojot 8128 e sovrshen broj

Более быстрый подход будет проверять не деление до broj, а квадратный корень из broj. Вместо того, чтобы вычислять квадратный корень напрямую, отслеживайте частное, а также остаток. Многие компиляторы предоставляют частное и остаток (% и /) с помощью одного вычисления, чтобы не подвергаться дополнительному дорогостоящему делению.

void Printing_out_the_perfect_numbers(int pocetok, int kraj) {
  for (int broj = pocetok; broj <= kraj; broj++) {
    int zbir_na_deliteli = 0;
    int kvocient = broj;
    for (int delitel = 1; delitel < kvocient; delitel++) {
      if (broj % delitel == 0) {
        kvocient = broj / delitel;
        zbir_na_deliteli += delitel;
        if (kvocient > delitel) {
          if (delitel != 1) zbir_na_deliteli += kvocient;
        } else {
          break;
        }
      }
    }
    if (zbir_na_deliteli == broj) {
      printf("Brojot %d e sovrshen broj\n", broj);
    }
  }
}

См. Идеальное число и Пагубное число

второй ответ быстрее с точки зрения времени выполнения?

ptushev 27.10.2018 10:57

@Spyware Да, быстрее. По мере увеличения n он намного быстрее. Но существуют даже более быстрые методы.

chux - Reinstate Monica 27.10.2018 20:22

Другие вопросы по теме