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

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

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

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


Гость






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

В FAQ лежит задача, но там на Супер числа Смита. Помогите, плз, реализовать эту задачу на Паскале, т.к. с Паскалем пока только начал разбираться, а задачу уже сдавать надо sad.gif
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 24.10.2007 19:23
Сообщение #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

 



- Текстовая версия 9.09.2025 17:03
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"