Замечательные числа |
Замечательные числа |
volvo |
30.11.2004 9:50
Сообщение
#1
|
Гость |
Числа и СуперЧисла Смита
Цитата Составное число называется Числом Смита, если сумма его цифр равна сумме всех чисел, образующихся разложением исходного числа на простые множители. Число Смита называется СуперЧислом Смита, если сумма его цифр является Числом Смита. Приведенная ниже программа ищет СуперЧисло Смита с номером X... { ********** Update: поскольку вышеприведенная функция поиска Суперчисел Смита работает очень медленно - выкладываю обновленную версию: Спойлер (Показать/Скрыть)
Немного информации о скорости работы: СуперСмит5. Старая версия: 62 мс., новая: 1 мс. СуперСмит100. Старая версия: 7653 мс., новая: 63 мс. СуперСмит200. Старая версия: 43891 мс., новая: 220 мс. Сообщение отредактировано: volvo - 6.11.2010 17:47 |
volvo |
10.12.2004 21:46
Сообщение
#2
|
Гость |
Определить, является ли число палиндромом (без его преобразования в строку)
Собираем из заданного числа "обратное" ему (с цифрами, записанными в обратном порядке), и проверяем заданное и "обратное" на равенство друг другу... function is_palindrom(x: longint): boolean; |
Altair |
25.12.2004 6:53
Сообщение
#3
|
Ищущий истину Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: 45 |
Поиск совершенных чисел.
Цитата Определенный интерес для любителей представляет программа поиска совершенных чисел. Ее схема проста: в цикле для каждого числа проверять сумму его делителей и сравнивать ее с самим числом, - если они равны, то это число совершенное. Код Var I,N,Summa: LongInt; Delitel: Integer; Begin For I := 3 To 34000000 Do Begin Summa := 1; For Delitel := 2 To Trunc(Sqrt(I)) Do Begin N := (I Div Delitel); If N * Delitel = I Then Summa := Summa + Delitel + (I Div Delitel); End; If Int(Sqrt(I)) = Sqrt(I) Then Summa := Summa - Trunc(Sqrt(I)); If I = Summa Then WriteLn(I, ' - ', Summa); End; End. Добавлено (volvo):
Проверка: простое-ли число. (вполне подходит для не самых больших чисел) Код function isPrime(X: word): boolean; var i: integer; Begin isPrime:=false; for i:=2 to trunc(sqrt(x)) do if x mod i = 0 then Exit; isPrime:=true End; Реализация вероятностного алгоритма Миллера-Рабина с 20 раундами. Для примера выдает простые на отрезке [1000000000,1000100000] Код function mulmod(x,y,m:longint):longint; assembler; asm mov eax,x mul y div m mov eax,edx end; function powmod(x,a,m:longint):longint; var r:longint; begin r:=1; while a>0 do begin if odd(a) then r:=mulmod(r,x,m); a:=a shr 1; x:=mulmod(x,x,m); end; powmod:=r; end; function isprime(p:longint):boolean; var q,i,a:longint; const rounds=20; begin if odd(p) then begin isprime:=true; q:=p-1; while not odd(q) do q:=q shr 1; for i:=1 to rounds do begin a:=Random(p-2)+2; if powmod(a,p-1,p)<>1 then begin isprime:=false; break; end; a:=powmod(a,q,p); if a<>1 then begin while (a<>1) and (a<>p-1) do a:=mulmod(a,a,p); if a=1 then begin isprime:=false; break; end; end; end; end else isprime:=(p=2); end; var t:longint; begin Randomize; for t:=1000000000 to 1000100000 do if isprime(t) then writeln(t); end. -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
volvo |
10.01.2005 9:04
Сообщение
#4
|
Гость |
Реализация вероятностного алгоритма Соловея-Штрассена
Алгоритм Соловея-Штрассена:
Программная реализация: function gcd(a, b : integer): integer; |
volvo |
28.01.2005 21:22
Сообщение
#5
|
Гость |
Числа Армстронга
Цитата Число Армстронга - такое число из k цифр, для которого сумма k-х степеней его цифр равна самому этому числу, например 153=1^3 +5^3 +3^3 Ниже приведены две функции для работы с числами Армстронга:
function Power(n, k: Integer): LongInt; |
volvo |
28.01.2005 22:35
Сообщение
#6
|
Гость |
Постоянная Капрекара
Цитата Выберите любое четырехзначное число, в котором не все цифры одинаковые. Расположите цифры сначала в порядке убывания, затем, переставив их в обратном порядке, образуйте новое число. Вычтите новое число из старого. Повторяя этот процесс с получающимися разностями (не более чем за семь шагов) получим число 6174, которое будет затем воспроизводить самого себя. Примечание: производя вычитания нули следует сохранять. Примеры: 4321 - 1234 = 3087 -> 8730 - 0378 = 8352 -> 8532 - 2358 = 6174. 1100 - 11 = 1089 -> 9810 - 189 = 9621 -> 9621 - 1269 = 8352 -> 8532 - 2358 = 6174. Ниже представлена программа для нахождения постоянной Капрекара из любого 4-х значного числа (распечатывает промежуточные значения и число итераций). function Justify(s: string; const n: Byte): string; |
Текстовая версия | 25.09.2024 22:09 |