
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.21] |
![]() |
|
Сообщ.
#1
,
|
|
|
Приветствую всех, на днях решил занятся изучением делфи, но т.к. я не программист то возникто сразу много вопросов.
вот например такая задача: в поле едит запрашивается положит число. определить явл оно простым или нет и если число не простое вывести его делители. вот что получилось у меня: procedure delitel; var i,n,k:integer; begin k:=0; n:=StrToInt(Form1.Edit1.Text); for i:=1 to n do if n mod i =0 then begin inc(k); form1.Label2.Caption:=IntToStr(i)+' '; end; if k=2 then Form1.Label1.Caption:=IntToStr(n)+ ' - простое число' else Form1.Label1.Caption:=IntToStr(n)+ ' - не простое число'; end; наведите на путь истинный, как вывести делители числа? буду очень благодарен. |
Сообщ.
#2
,
|
|
|
можно попробывать в цикле от 1 до ТвоеЧисло -1 попробывать твое число делить на переменную цикла и если результат деления будет целочисленным, то вот ты и получил уже два делителя
|
Сообщ.
#3
,
|
|
|
Есть два классических способа решения - поищи в гугле: решето Эратосфена (для простых случаев), тест Рабина-Миллера (для очень больших чисел)
|
Сообщ.
#4
,
|
|
|
а вообще так сходу не скажу... мож какие математические методы есть:)
Добавлено Ins лучше решение сказал:) |
Сообщ.
#5
,
|
|
|
насколько я понимаю после этого условия
for i:=1 to n do if n mod i =0 then в n хранится делитель, или нет? |
Сообщ.
#6
,
|
|
|
Цитата serdemon @ for i:=1 to n do if n mod i =0 then в n хранится делитель, или нет? Ну и зачем тебе делить до n, если можно делить до sqrt(n) + 1? И зачем тебе делить на 4, если можно ограничится только проверкой делимости на 2? Почитай про решето Эратосфена, лениво два слова в гугле набрать? ![]() |
Сообщ.
#7
,
|
|
|
делитель хранится в i. а n - это число для которого ты делители ищеш
|
Сообщ.
#8
,
|
|
|
Метод рабочий, но не самый быстрый.
![]() ![]() 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; |
Сообщ.
#9
,
|
|
|
Ins прав. я приблизительный вариант предложил
|
Сообщ.
#10
,
|
|
|
извините, за мои глупые вопросы...
про решето Эратосфена я прочитал, но не особо понял, т.к. там еще и с массивом. ребят вы меня похоже немного не поняли, я хочу используя свой код (он у меня работает) вывести все делители числа (через пробел или запятую, без разницы). можно даже так в поле эдит я ввожу число, мне нужно вывести все его делители |
Сообщ.
#11
,
|
|
|
![]() ![]() 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)+ ' - не простое число'; |
Сообщ.
#12
,
|
|
|
and85 спасибо, только было бы лучше, если б ты просто подсказал как сделать
|
Сообщ.
#13
,
|
|
|
А при чем тут простые числа тогда, если тебе делители нужны?
Перебираешь от 1 до k (тупо без оптимизации), проверяешь, делится или нет. Если делится, добавляешь в строку. Вот и весь алгоритм. |
Сообщ.
#14
,
|
|
|
мне нужно было сделать так, определить какое число, если простое то вывести сообщение "число н простое", а если оно не простое то вывести сообщение "число н не простое" и еще одно сообщение где указаны все его делители
P.S. спасибо всем за помощь. |
![]() |
Сообщ.
#15
,
|
|
Если не умеешь работать с массивами, то вот алгоритм
|