2009-10-12 9 views
0

Как я могу генерировать все идеальные числа от 1 до 100?Поиск идеальных чисел от 1 до 100

Идеальное число - положительное целое число, равное сумме его собственных делителей. Например, 6 (= 1 + 2 + 3) - идеальное число.

+3

«нет» (пролог шутка) –

ответ

1

Я не уверен, если это то, что вы искали, но вы всегда можете просто распечатать «6, 28» ...

+2

Ваше имя Ваша программа? – markus

+0

........... ;-) – arno

+0

Ну давай, я всегда использую препроцессор в моей голове, чтобы сделать мое программирование всякий раз, когда я могу. Мне нравится элегантность этого. :) – Clueless

1

Ну похоже, что вам нужно цикл вплоть до п/2, что составляет 1/2 от n. Разделите число, и если нет остатка, вы можете включить его в общую сумму, как только вы исчерпали 1/2 из n, тогда вы проверите, было ли ваше общее количество добавлено = номер, который вы тестируете.

Например:

#include "stdafx.h" 
#include "iostream" 
#include "math.h" 
using namespace std; 

int main(void) 
{ 
    int total=0; 

    for(int i = 1; i<=100; i++) 
    { 
     for(int j=1; j<=i/2; j++) 
     { 
      if (!(i%j)) 
      { 
       total+=j; 
      } 
     } 
     if (i==total) 
     { 
      cout << i << " is perfect"; 
     } 
     //it works 
     total=0; 
    } 

    return 0; 
} 
+0

Кстати, это могут быть оптимизированные люди, которых я знаю, но это делает работу в читаемом коде :) – JonH

+0

Кстати, это было сделано на C++, вы могли бы сделать это на C#, VB.net или любой другой язык j Следуйте логике, стоящей за ней. Первый цикл до 100 включительно, потому что вы заявили, что ищете идеальное число до 100. Затем второй цикл используется в качестве делителя и доходит до i/2, что составляет 1/2 вашего n. Если нет остатка! (I% j), это означает, что он делится равномерно, и вы можете включить его в свою сумму. В противном случае продолжайте цикл. После того, как вы выйдете из цикла, то есть j = i/2, тогда вы просто проверяете, действительно ли ваш накопленный итог = ваш исходный n (i). Если они равны, то это идеальное число! – JonH

3

Так что я подозреваю, что Фрэнк ищет ответ в Прологе, да и это не запах, а homeworky ...

Для удовольствия я решил написать мой ответ. Мне потребовалось около 50 строк.

Итак, вот схема моих предикатов. Возможно, это поможет вам подумать о прологе.

is_divisor(+Num,+Factor) 

    divisors(+Num,-Factors) 
    divisors(+Num,+N,-Factors) 

    sum(+List,-Total) 
    sum(+List,+Sofar,-Total) 

    is_perfect(+N) 

    perfect(+N,-List) 

+ и - не являются частью имен параметров. Они представляют собой документальную информацию о том, что автор ожидает создать. (NB) «+ Foo» означает, что вы ожидаете, что Foo будет иметь значение при вызове предиката. «-Foo» означает, что вы ожидаете, что Foo будет переменной при вызове предиката и даст ему значение к моменту окончания. (вроде как вход и выход, если это помогает так думать)

Всякий раз, когда вы видите пару предикатов, таких как сумма/2 и сумма/3, коэффициенты - это сумма/2, такая как обертка к сумме/3, который делает что-то вроде accumulator.

Я не удосужился заставить его распечатать их красиво. Вы можете просто запросить его непосредственно в командной строке Пролог:

?- perfect(100,L). 
L = [28, 6] ; 
fail. 

Другое дело, что может быть полезным, что я нахожу с Пролога предикатами, является то, что, как правило, два вида. Один из них проверяет, действительно ли что-то истинно. Для такого рода предикатов вы хотите, чтобы все остальное потерпело неудачу. Они не имеют тенденций быть рекурсивными.

Другие захотят пройти через диапазон (чисел или списка) и всегда возвращать результат, даже если он равен 0 или []. Для этих типов предикатов вам нужно использовать рекурсию и подумать о своем базовом случае.

HTH.

NB: Это называется «режим», и вы можете указать их, и компилятор/интерпретатор будет применять их, но я лично просто использую их в документации. Также попытался найти страницу с информацией о режиме Prolog, но я не могу найти хорошую ссылку. :(

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