2015-07-27 2 views
1

У меня есть следующая программа, отличные номера не печатаются, только вывод - это цифры 1 и 2, которые не идеальны. Что случилось, это проблема с областью или это петли? Добавление заявления перерыва после оператора печати вызывает вывод всех чисел 1 - 99.Идеальные числа в C, не печатаются

int sum = 0; 

for (int i = 1; i < 100; i++) { 

    for (int j = 1; j <= i; j++) { 

     if (i % j == 0){ 

      sum += j;} 

     if (sum == i){ 

      printf("%d\n", i); 

     } 
    } 
} 
+0

Ну, ни 1, ни 2 не являются идеальными числами. Поэтому я начну с этого. Вы должны посмотреть [this] (http://stackoverflow.com/questions/26753839/efficiently-getting-all-divisors-of-a-given-number) и работать оттуда. – CoffeeandCode

+1

Сумма должна начинаться с нуля при каждой итерации внутреннего цикла. – o11c

+0

Обратите внимание, что есть только два идеальных числа ниже 100 (они не 1 и 2, это связано с ошибкой в ​​вашем состоянии цикла), и только пять ниже 100 миллионов, поэтому вы не найдете их много в ближайшее время с этим методом, надеюсь, это всего лишь упражнение. =) – Arkku

ответ

4

Три проблемы:

  1. sum должен быть инициализирован к нулю каждыйi, а не только в начале
  2. второе условие цикла должно быть j < i, в соответствии с определением совершенного числа само число исключается
  3. чек на sum == i и следующие printf должны быть перемещены за пределы внутреннего контура, в противном случае он печатает промежуточные результаты
+0

Это * идеальный * ответ - я удаляю мой. –

0

Я думаю, что вам не нужно, чтобы проверить все пути к I (J < я) ... достаточно, чтобы достичь я/2 ...

#include<stdio.h> 
void main() { 
    int sum; 
    for (int i = 1; i < 100; i++) { 
     sum = 0; 
     for (int j = 1; j <= i/2; j++) { 
      if (i % j == 0) { 
       sum += j; 
      } 
     } 
     if (sum == i) { 
      printf("%d\n", i); 
     } 
    } 
} 
+1

Если мы хотим получить оптимизацию, есть и многое другое, но в итоге самый быстрый код для печати всех совершенных чисел в диапазоне 32-битных 'int' -' puts ("6 \ n28 \ n496 \ n8128 \ n33550336 ");' =) – Arkku

+0

kool :))))))))) .. Это на самом деле работает !!! hehehehehehe: P – mlwn

+1

@Arkku и я могу думать о еще более быстром коде, чтобы напечатать все нечетные, даже используя unsigned long long –

1

дал этот код, который включает в себя все предыдущие комментарии/ответы:

#include <stdio.h> 


int main(void) 
{ 
    int sum = 0; 

    for (int i = 1; i < 100; i++) 
    { 
     sum = 0; // reset on each new number 

     for (int j = 1; j < i; j++) 
     { 
      if (i % j == 0) 
      { 
       sum += j; 
      } // end if 
     } // end for 

     if (sum == i) 
     { 
      printf("%d\n", i); 
     } // end if 
    } // end for 
    return 0; 
} // end function: main 

выход 6 и 28

Смежные вопросы