1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
function Prime(a: Cardinal): boolean; var i1, i2, i3, i4, i5, i6, i7, i8, bound: Cardinal; begin if a<2 then result:=false else if a in [2,3,5,7,11,13,17,19,23,29] then result:=true else if(a mod 2 =0)or(a mod 3 =0)or(a mod 5 =0)or(a mod 7 =0)or(a mod 11=0)or (a mod 13=0)or(a mod 17=0)or(a mod 19=0)or(a mod 23=0)or(a mod 29=0)then result:=false else begin bound:=trunc(sqrt(a)); i1:=31; i2:=37; i3:=41; i4:=43; i5:=47; i6:=49; i7:=53; i8:=59; while(i8<=bound)and(a mod i1<>0)and(a mod i2<>0)and(a mod i3<>0)and(a mod i4<>0)and (a mod i5<>0)and(a mod i6<>0)and(a mod i7<>0)and(a mod i8<>0)do begin inc(i1,30); inc(i2,30); inc(i3,30); inc(i4,30); inc(i5,30); inc(i6,30); inc(i7,30); inc(i8,30); end; result:=(i8>bound)and ((i1>bound)or(i2>bound)or(i3>bound)or(i4>bound)or(i5>bound)or(i6>bound)or(i7>bound)or ((a mod i1)or(a mod i2)or(a mod i3)or(a mod i4)or(a mod i5)or(a mod i6)or(a mod i7)<>0)); end; end; |
I want to read all prime numbers between 1 and 10000 into a dynamic array and all non-prime numbers into another dynamic array and then read the prime array into richedit1
so far I have:
procedure primearrays;
var
j, k, l, i, m: integer; // k is the number I am testing for prime number
// j is used in the for loop to check all numbers smaller than k to see if k is dividable by j
// l is just a variable set to k mod j to make the if run more smoothly
// i is the length of the array anotprime
// m is used to set the length of the array aprime
bflag: boolean; // bflag is to show if this number is a prime number
aprime, anotprime: array of integer;
// aprime is the array of prime and anotprime is the array of nonprime numbers
begin
j := 0;
i := 0;
l := 0;
richedit1.Lines.Clear;
bflag := false;
for k := 2 to 10000 do
begin
j := 0;
while not(j = (k - 1)) do
begin
inc(j);
l := k mod j;
if (l = 0) then
begin
bflag := false;
inc(i);
setlength(anotprime, i);
anotprime[i - 1] := k;
j := k - 1;
end
else
begin
bflag := true;
end;
end;
m := -1;
if (bflag) then
begin
inc(m);
setlength(aprime, m);
aprime[m - 1] := k;
richedit1.Lines.Add(inttostr(aprime[l-1]));
end;
end;
end;
but this doesn’t seem to work. It puts all the integers into anotprime
.
LU RD
34.4k5 gold badges88 silver badges294 bronze badges
asked Nov 12, 2014 at 8:13
10
Perhaps the main problem you have is that you mix all the different aspects (looping over candidates, prime checking, display etc.) into a single function.
Life becomes much easier if you decompose the task into small pieces that just perform a single task. Start with a function to test if a number is prime.
function IsPrime(N: Integer): Boolean;
var
M: Integer;
begin
Assert(N > 0);
if N = 1 then // annoying special case
begin
Result := False;
exit;
end;
for M := 2 to (N div 2) do
begin
if N mod M = 0 then
begin
Result := False;
exit;
end;
end;
Result := True;
end;
Now you might wish to make a list containing primes:
var
Primes: TList<Integer>;
N: Integer;
....
// create Primes
for N := 1 to 10000 do
if IsPrime(N) then
Primes.Add(N);
This is not the most efficient way to enumerate primes. But it’s probably where you should start and I’ve mainly written this answer to encourage you to separate code into small logical methods that do specific focused tasks.
RepeatUntil
2,2724 gold badges32 silver badges57 bronze badges
answered Nov 12, 2014 at 10:17
David HeffernanDavid Heffernan
599k42 gold badges1061 silver badges1479 bronze badges
8
procedure TForm1.btnprimeClick(Sender: TObject);
var K, I, iCount : Integer;
begin
for K := iStart to iEnd do
begin
iCount := 0;
for I := 2 to iEnd do
begin
if K mod I = 0 then
begin
Inc(iCount);
end;
end;
if iCount = 1 then
begin
memData.Lines.Add(IntToStr(K));
end;
end;
end;
TERMINATOR
1,1501 gold badge10 silver badges24 bronze badges
answered May 31, 2017 at 15:14
Автор : ZED.
Для начала определимся, какое число является простым.
Простое число — это натуральное число, которое имеет только два делителя: 1 и само число. Например числа — 1 и 2 — являются простыми, так как делятся без остатка только на 1 и на само себя, и больше делителей не имеют. Ну тут все понятно.
Теперь, когда мы определились с математикой, приступим непосредственно к написанию довольно простенькой програмки, которая и будет определять(вычислять) — является ли число простым или нет.
Писать мы будем на Delphi.
Следует только догадываться, что нужно сделать сначала…Совершенно верно: мы запускаем делфу и скорее всего новый проект уже открыт.
Теперь установим свойства формы. Размер пока не трогаем. Лучше изменим свойство BorderStyle в bsSingle (т.е. размер формы изменятся не будет). Затем изменим свойство BorderIcons таким образом:
biSystemMenu — true
biMinimize — true
biMaximize — false
biHelp — false
т.е. мы фактически изменили одно свойство biMaximize, чтобы наше окно(окно программы) нельзя было разворачивать(максимизировать).
Теперь изменим свойство Caption. Например напишем : Прога определяет простое число или нет. Хотя можно написать что-то вроде : Моя прога. Вообщем, что вашей душе угодно. Это не так уж и важно.
Ну а теперь расставим компоненты. Тут тоже можно сделать как кому нравится.
Я предлагаю следующие : TEdit — для ввода числа, TMemo — для вывода результата(хотя можно и TEdit например…а может быть и нужно, но суть не меняется. Можете вообще рисовать на форме текст[TextOut]), и TButton — для выполнения расчета. Так же поместим два компонента TLabel. В свойстве первого Caption пишем : Введите число, а второго : Результат. Очищаем Text у TEdit, и Lines у TMemo. А в свойстве Caption компонента TButton пишем : Проверить.
Ну а когда расставили все компоненты можно изменить размер формы.
В общем наша форма теперь выглядит примерно так:
Ну а теперь напишем процедуру для определения сложного числа(или простого, если оно таковым является).
итак наша процедурка будет выглядеть так (все закомментировано):
procedure TForm1.NFigure;
var figure,i:integer;//введенное число и переменная цикла
f:boolean;//логическая переменная
begin
//переводим введенную строку(число в TEdit) в целочисленный тип
// и присваиваем значение переменной figure
figure:=StrToInt(Edit1.Text);
//если число 1 или 2, то не вычисляем, а сразу выводим результат — число ПРОСТОЕ
if ((figure=1) or (figure=2)) then
begin
memo1.Text:=’Число ‘+Edit1.Text+’ ПРОСТОЕ!’;//Это собственно вывод результата
end else
//в противном случае(если число отлично от 1 или 2)
begin
//то
//присваиваем логической переменной f значение false (типа, число пока простое)
f:=false;
//теперь начинаем искать делители, начиная с 2 и до числа меньшего нашего на единицу
//т.е. простое число итак делится на 1 и на само себя без остатка(и только-больше делителей //быть не должно)
for i:=2 to figure-1 do
begin
//если число делится без остатка(хотя бы один раз, то число уже не простое)
if (figure mod i)=0 then
//значит изменяем значение переменной на true
f:=true;
end;
//теперь проверяем: «если не f, то число ПРОСТОЕ»(т.е. если значение не true(а значит //false-какое и было изначально перед поиском делителей),)
if not(f) then
memo1.Text:=’Число ‘+Edit1.Text+’ ПРОСТОЕ!’ else
//в противном случае число СЛОЖНОЕ!
memo1.Text:=’Число ‘+Edit1.Text+’ СЛОЖНОЕ!’;
end;
end;
Теперь напишем обработчик события ONChange компонента TEdit (TForm1.Edit1Change) .
Это будет реализация «Защиты от дурака». Нам ведь не нужно, чтобы какой-нибудь нехороший юзверь ввел какое-нибудь слово вместо числа или цифры, в частности.
Так что приступим к этому простому занятию. Все опять же закомментировано и понятно.
//Проверка правильности ввода данных
//»Защита от дурака»
procedure TForm1.Edit1Change(Sender: TObject);
var CH:Set of Char;//множество символов
s:string;//строка символов
i:byte;
begin
//определяем множество — только числа от 0 до 9
CH:=[‘0’..’9′];
s:=Edit1.Text;
//перебор каждого символа строки
for i:=1 to length(s) do
begin
//если введен символ, которого нет во множестве
if not(s[i] in CH) then
begin
//сообщение об ошибке
messagedlg(‘ВВОДИТЬ МОЖНО ТОЛЬКО ЦИФРЫ!’,mtWarning,[mbok],0);
//очистка поля ввода
Edit1.Clear;
end;
end;
end;
Ну вот, впринципе, все и готово.
Теперь просто добаляем в обработчик события OnClick нашей кнопочки следующее(вызов нашей процедуры):
procedure TForm1.Button1Click(Sender: TObject);
begin
NFigure;
end;
Наша программа готова. Просто сохраним и откомпилим проект(Ctrl+F9).
ИСХОДНИК ПРОГРАММЫ МОЖНО СКАЧАТЬ ЗДЕСЬ >>
|
|
|
Пожалуйста, выделяйте текст программы тегом [сode=pas] … [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как «свернуть» программу в трей.
3. Как «скрыться» от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
… (продолжение следует) …
Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.
Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка — 60 дней. Последующие попытки бан.
Мат в разделе — бан на три месяца…
Проверка числа на простоту
, выод делителей
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
Приветствую всех, на днях решил занятся изучением делфи, но т.к. я не программист то возникто сразу много вопросов. вот что получилось у меня: наведите на путь истинный, как вывести делители числа? буду очень благодарен. |
and85 |
|
можно попробывать в цикле от 1 до ТвоеЧисло -1 попробывать твое число делить на переменную цикла и если результат деления будет целочисленным, то вот ты и получил уже два делителя |
—Ins— |
|
Есть два классических способа решения — поищи в гугле: решето Эратосфена (для простых случаев), тест Рабина-Миллера (для очень больших чисел) |
and85 |
|
а вообще так сходу не скажу… мож какие математические методы есть:) Добавлено 10.07.08, 11:34 |
serdemon |
|
насколько я понимаю после этого условия |
—Ins— |
|
Цитата serdemon @ 10.07.08, 11:40 for i:=1 to n do Ну и зачем тебе делить до n, если можно делить до sqrt(n) + 1? И зачем тебе делить на 4, если можно ограничится только проверкой делимости на 2? Почитай про решето Эратосфена, лениво два слова в гугле набрать? |
and85 |
|
делитель хранится в i. а n — это число для которого ты делители ищеш |
Domino |
|
Метод рабочий, но не самый быстрый.
function IsSimple(const Val: Cardinal): Boolean; var I: Cardinal; begin I := 2; Result := True; while I <= round(Sqrt(Val)) do begin if (Val mod I) = 0 then Result := False; Inc(I); end; end; Сообщение отредактировано: Domino — 10.07.08, 11:54 |
and85 |
|
Ins прав. я приблизительный вариант предложил |
serdemon |
|
извините, за мои глупые вопросы… Сообщение отредактировано: serdemon — 10.07.08, 12:20 |
and85 |
|
k:=0; n:=StrToInt(Edit1.Text); Label2.Caption := »; for i:=1 to n do if n mod i =0 then begin inc(k); Label2.Caption:=Label2.Caption + IntToStr(i)+’ ‘; end; if k=2 then Label1.Caption:=IntToStr(n)+ ‘ — простое число’ else Label1.Caption:=IntToStr(n)+ ‘ — не простое число’; |
serdemon |
|
and85 спасибо, только было бы лучше, если б ты просто подсказал как сделать |
Domino |
|
А при чем тут простые числа тогда, если тебе делители нужны? |
serdemon |
|
мне нужно было сделать так, определить какое число, если простое то вывести сообщение «число н простое», а если оно не простое то вывести сообщение «число н не простое» и еще одно сообщение где указаны все его делители P.S. спасибо всем за помощь. |
ttiger |
|
Если не умеешь работать с массивами, то вот алгоритм |
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- Delphi: Общие вопросы
- Следующая тема
[ Script execution time: 0,0682 ] [ 16 queries used ] [ Generated: 24.05.23, 22:40 GMT ]
Найти простое число
Falk0ner, вс, 06/07/2008 — 15:35.
- Арифметика, системы счисления, комплексные числа
Найти простое число
unit simple_;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
Edit1: TEdit;
Label2: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
n: integer; // проверяемое число
d: integer; // делитель
r: integer; // остаток от деления n на d
begin
n := StrToInt(Edit1.text);
d := 2; // сначала будем делить на два
repeat
r := n mod d;
if r <> 0 {// n не разделилось нацело на d} then
d := d + 1;
until r = 0; // повторять пока не найдено число на n делится без остатка
label2.caption := Edit1.text;
if d = n then
label2.caption := label2.caption + ‘ — простое число.’
else
label2.caption := label2.caption + ‘ — обычное число.’;
end;
end.
DelphiWorld 6.0