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

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

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

 
 Ответить  Открыть новую тему 
> число Смита
Athlon
сообщение 14.12.2008 18:24
Сообщение #1





Группа: Пользователи
Сообщений: 3
Пол: Мужской

Репутация: -  0  +


Вот на форуме нашел программку, которая проверяет, является ли заданное число числом Смита:

function GetOneDigits(n: LongInt): Integer;
var s: Integer;
begin
s := 0;
while n <> 0 do begin
Inc(s, n mod 10);
n := n div 10;
end;
GetOneDigits := s
end;

function GetSimpleDigits(n: LongInt; var amount: Integer): Integer;
var
s, factor: Integer;
begin
s := 0; factor := 2;
amount := 0;
repeat
if n mod factor = 0 then begin
s := s + GetOneDigits(factor); Inc(amount);
n := n div factor
end
else Inc(factor)
until n = 1;
GetSimpleDigits := s
end;

function GetSmith(n: Integer): LongInt;
var
i, amount: Integer; od, sd: Integer;
count: LongInt;
Found: Boolean;
begin
i := 0; count := 2;
while i <> n do begin
repeat
Inc(count);
Found :=
(GetOneDigits(count) = GetSimpleDigits(count, amount))
and
(amount > 1)
until Found;
Inc(i)
end;
GetSmith := Count
end;

function IsSmith(n: LongInt): Boolean;
var
i: Integer;
next: LongInt;
begin
i := 0;
repeat
Inc(i); next := GetSmith(i)
until next >= n;
IsSmith := (next = n)
end;

var
X: Integer;
f:text;
begin
readln(x);
if IsSmith(X) then write('TRUE') else write('FALSE');
end.


У меня вопрос: есть ли программы, которые работают быстрее???
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 14.12.2008 18:46
Сообщение #2


Гость






Цитата
есть ли программы, которые работают быстрее???
Это вряд ли... В любом случае придется раскладывать число на простые сомножители, а это достаточно длительный процесс... А в чем, собственно, проблема? Надо проверять много чисел, или большие числа?
 К началу страницы 
+ Ответить 
Athlon
сообщение 14.12.2008 18:49
Сообщение #3





Группа: Пользователи
Сообщений: 3
Пол: Мужской

Репутация: -  0  +


Цитата
А в чем, собственно, проблема? Надо проверять много чисел, или большие числа?

Нужно найти все числа Смита до 30000.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 14.12.2008 19:31
Сообщение #4


Гость






Попробуй, может быть вот так побыстрее будет? smile.gif

function SumDigits(n: longint): integer;
var s: integer;
begin
s := 0;
while n <> 0 do begin
Inc(s, n mod 10);
n := n div 10;
end;
SumDigits := s
end;

function Factorization(X: longint): longint;
var
i, s: word;

procedure DivX;
begin
while (x > 1) and (x mod i = 0) do begin
inc(s, SumDigits(i));
x := x div i;
end;
end;

begin
s := 0;

i := 2;
DivX;
i := 3;
while (i < x div 2) do begin
DivX;
inc(i,2);
end;
if x > 1 then inc(s, SumDigits(x));

Factorization := s;
end;


function isPrime(X: word): boolean;
var i: integer;
begin
isPrime:=false;
if not odd(x) and (x <> 2) then exit;
i := 3;

while i <= sqrt(x) do begin
if x mod i = 0 then exit;
inc(i,2);
end;
isPrime := true;
end;


var
i: integer;

begin
for i := 1 to 30000 do begin
if not isprime(i) and
(SumDigits(i) = Factorization(i)) then write(i:6);
end
end.


Сообщение отредактировано: volvo - 14.12.2008 19:31
 К началу страницы 
+ Ответить 
Athlon
сообщение 14.12.2008 20:26
Сообщение #5





Группа: Пользователи
Сообщений: 3
Пол: Мужской

Репутация: -  0  +


Спасибо. Всё работает)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 



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