Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.04.2013, 09:31   #1
штангенциркуль
 
Аватар для штангенциркуль
 
Регистрация: 26.02.2013
Сообщений: 3
Вопрос Циклы С++

Завис на вроде бы несложной задачке на циклы.

"Число, равное сумме всех своих делителей, включая единицу, называется совершенным. Найти и напечатать все совершенные числа в интервале от 2 до n."

Код:
#include <conio.h>
#include <stdio.h>
int main ()
{
int n, i, j, sum;
int k = 2;
sum = 0;
printf("Vvedite n:\n");
scanf_s("%d", &n);
for (k;k<=n;k++) //диапазон поиска совершенного числа
{
    for (i=1;i<n;i++) //диапазон поиска делителей
  {
    j = k%i;
    if (j == 0) sum=sum+i; // поиск делителей
  }
  if (sum == k) printf("Sovershennoe 4islo: %d \n", sum);
}
_getch();
return 0;
}
После ввода n программа не выводит абсолютно ничего. Где эта зараза зацикливается, сам понять не могу. До этого были вариации кода с применением цикла while, но и там результат тот же. Подскажите, пожалуйста, что я сделал не так?
Чертям и призракам запрещено
Наружу выходить иной дорогой,
Чем внутрь вошли; закон на это строгий.
штангенциркуль вне форума Ответить с цитированием
Старый 06.04.2013, 10:07   #2
Че Гевара
Форумчанин
 
Аватар для Че Гевара
 
Регистрация: 25.09.2012
Сообщений: 182
По умолчанию

А помоему она не зацикливается, и делает всё по вашему алгоритму, в общем попробуйте скомпилить мой вариант с маленьким добавлением и сами всё поймёте:
Код:
#include <conio.h>
#include <stdio.h>
int main ()
{
int n, i, j, sum;
int k = 2;
sum = 0;
printf("Vvedite n:\n");
scanf_s("%d", &n);
for (k;k<=n;k++) //диапазон поиска совершенного числа
{
    for (i=1;i<n;i++) //диапазон поиска делителей
  {
    j = k%i;
    if (j == 0) sum=sum+i; // поиск делителей
  }
  if (sum == k) printf("Sovershennoe 4islo: %d \n", sum);
}
if(sum == 0) printf("Programma ne nashla takih chisel");
_getch();
return 0;
}
Отладка кода вдвое сложнее, чем его написание. Так что если вы пишете код настолько умно, насколько можете, то вы по определению недостаточно сообразительны, чтобы его отлаживать.
Brian W. Kernighan.

Последний раз редактировалось Че Гевара; 06.04.2013 в 10:12.
Че Гевара вне форума Ответить с цитированием
Старый 06.04.2013, 20:02   #3
штангенциркуль
 
Аватар для штангенциркуль
 
Регистрация: 26.02.2013
Сообщений: 3
По умолчанию

Цитата:
А помоему она не зацикливается, и делает всё по вашему алгоритму, в общем попробуйте скомпилить мой вариант с маленьким добавлением и сами всё поймёте:
К сожалению, Ваши маленькие корректировки оказались несущественны и на выходе по прежнему пусто.
К тому же, если N задать равным 1000, в этом промежутке должно найтись три таких числа (я проверял, но пруфов не будет). Вот и понять не могу, то ли эта сволочь где-то зависает, то ли у меня с выводом что-то не то...
Чертям и призракам запрещено
Наружу выходить иной дорогой,
Чем внутрь вошли; закон на это строгий.
штангенциркуль вне форума Ответить с цитированием
Старый 06.04.2013, 20:19   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код:
#include <conio.h>
#include <stdio.h>

int main ()
{
    int n, i, j, sum, k;
    printf("Vvedite n:\n");
    scanf("%d", &n);
    for (k = 2; k <= n; k++)
    {
        for (i = 2, sum = 1; i <= k/2; i++)
            sum += i * (k % i == 0);
        if (sum == k) printf("Sovershennoe 4islo: %d\n", k);
    }
    getch();
    return 0;
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 06.04.2013, 21:04   #5
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Подскажите, пожалуйста, что я сделал не так?
Вы обнуляете sum только один раз, перед входом в цикл. Соответственно, к моменту, когда k==6 (первое совершенное число), sum уже содержит 1+1+1+2+1 (от итераций k=2,3,4,5).
Abstraction вне форума Ответить с цитированием
Старый 07.04.2013, 18:55   #6
штангенциркуль
 
Аватар для штангенциркуль
 
Регистрация: 26.02.2013
Сообщений: 3
По умолчанию

Теперь всё встало на свои места. Всем спасибо огромное за помощь!
Чертям и призракам запрещено
Наружу выходить иной дорогой,
Чем внутрь вошли; закон на это строгий.
штангенциркуль вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
циклы Katya20 Паскаль, Turbo Pascal, PascalABC.NET 0 22.12.2011 17:30
синусы и ко. циклы, вроде циклы Scorch92 Паскаль, Turbo Pascal, PascalABC.NET 2 22.12.2010 19:26
Циклы Ya_Aston Помощь студентам 8 11.12.2010 01:37
Циклы - вложенны циклы? tigga Microsoft Office Excel 5 19.02.2010 23:36
C++ циклы KOLYTFR Помощь студентам 5 26.04.2009 23:38