Как я могу генерировать все идеальные числа от 1 до 100?Поиск идеальных чисел от 1 до 100
Идеальное число - положительное целое число, равное сумме его собственных делителей. Например, 6 (= 1 + 2 + 3) - идеальное число.
Как я могу генерировать все идеальные числа от 1 до 100?Поиск идеальных чисел от 1 до 100
Идеальное число - положительное целое число, равное сумме его собственных делителей. Например, 6 (= 1 + 2 + 3) - идеальное число.
Я не уверен, если это то, что вы искали, но вы всегда можете просто распечатать «6, 28» ...
Ну похоже, что вам нужно цикл вплоть до п/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;
}
Кстати, это могут быть оптимизированные люди, которых я знаю, но это делает работу в читаемом коде :) – JonH
Кстати, это было сделано на C++, вы могли бы сделать это на C#, VB.net или любой другой язык j Следуйте логике, стоящей за ней. Первый цикл до 100 включительно, потому что вы заявили, что ищете идеальное число до 100. Затем второй цикл используется в качестве делителя и доходит до i/2, что составляет 1/2 вашего n. Если нет остатка! (I% j), это означает, что он делится равномерно, и вы можете включить его в свою сумму. В противном случае продолжайте цикл. После того, как вы выйдете из цикла, то есть j = i/2, тогда вы просто проверяете, действительно ли ваш накопленный итог = ваш исходный n (i). Если они равны, то это идеальное число! – JonH
Так что я подозреваю, что Фрэнк ищет ответ в Прологе, да и это не запах, а 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, но я не могу найти хорошую ссылку. :(
«нет» (пролог шутка) –