IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Числа Смита, Не та задача, что в FAQ
сообщение
Сообщение #1


Гость






Есть такая задача:
Цитата
Составное число называется числом Смита, если сумма его цифр равна сумме цифр всех чисел, образующихся разложением исходного числа на простые множители. Найти число Смита с номером N

В FAQ лежит задача, но там на Супер числа Смита. Помогите, плз, реализовать эту задачу на Паскале, т.к. с Паскалем пока только начал разбираться, а задачу уже сдавать надо sad.gif
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






По многочисленным просьбам телезрителей... Брррр.... автора темы публикую реализацию данной задачи без подпрограмм:


var
n: integer;
i, candidate, buffer, T: integer;
s, s_digits, amount, factor: integer;
begin
{ Вводим номер искомого числа Смита }
write('n = '); readln(n);

{
В переменной Candidate будет храниться проверяемое на данный момент число,
в конечном итоге она будет содержать N-ое число Смита
}
candidate := 2;

{ Проходим в цикле, чтобы пропустить N-1 первых, не нужных нам, чисел Смита }
for i := 0 to n - 1 do begin
repeat

inc(candidate);

{
1 этап: найдем сумму цифр числа Candidate... Для того, чтобы не повредить
само число, будем работать с его копией - Buffer.

Алгоритм поиска суммы цифр не должен вызывать сложностей: выделение последней
цифры посредством "mod 10", суммирование этих последних цифр и удаление уже
просуммированной цифры из числа через "div 10"
}
buffer := candidate;

s_digits := 0;
while buffer <> 0 do begin
s_digits := s_digits + (buffer mod 10);
buffer := buffer div 10;
end;

{
Теперь найдем количество (amount) и сумму цифр (s) всех простых множителей
числа Candidate. Опять предотвращаем порчу числа работой с копией ...
}
buffer := candidate;

amount := 0; s := 0;
factor := 2; { Factor - это делитель ... }
repeat
if buffer mod factor = 0 then begin
{
Если остаток от деления числа на фактор = 0, значит Factor - простой множитель числа,
все что остается - найти его сумму цифр (по алгоритму, описанному выше), увеличить счетчик
простых множителей, и разделить число-кандидат на Factor, чтобы дальше продолжать
раскладывать на простые сомножители
}
T := factor;
while T <> 0 do begin

s := s + (T mod 10);
T := T div 10;

end;
amount := amount + 1;
buffer := buffer div factor;
end
else factor := factor + 1; { <--- Если же число на Factor нацело не делится - увеличиваем делитель}

{
Условие окончания цикла разложения на множители - если после очередного шага у нас
осталась единица. Все, цикл окончен, сумму цифр и количество сомножителей нашли...
}
until buffer = 1;

{
Если проверенное нами выше число - кандидат все-таки НЕ является числом Смита
(то есть, условие, записанное ниже НЕ выполняется), то внешний цикл Repeat/Until
начнется сначала, так будет продолжаться до тех пор, пока ВОТ В ЭТОМ МЕСТЕ
Candidate не будет являться числом Смита.
}
until (s_digits = s) and (amount > 1);

{
Сюда попадаем только в случае, когда предыдущее условие истинно, следовательно i-ое
число Смита мы нашли, ищем следующее или выходим (если найдено уже столько, сколько
было нужно)
}
end;

writeln(candidate); { <--- Что и требовалось найти... }
end.



Soontir Fel, задавай вопросы на форуме, а не в привате, договорились?
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 30.11.2020 15:52
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name