Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Технологии > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 25.10.2008, 02:27   #1
Chidory
Пользователь
 
Аватар для Chidory
 
Регистрация: 15.06.2008
Сообщений: 10
Печаль Задача в Delphi

По заданному целому A (0< A< 1.000.000.000) найти минимальное N, при котором N**N (N в степени N) будет делиться на A без остатка. Надо написать программу,которая будет работать эффективнее, чем простой перебор всех значений N.
Я написала что-то,но если вводить большие числа,то программа всё равно тормозит и зависает на некоторое время...а этого не хочется...
Вот моя программа:
procedure TForm1.Button1Click(Sender: TObject);
var d,d2,i,l,k,k1,s1,p,s,j:integer; max:real; n1:longint; a:array of integer; b:array of real;
begin
if SpinEdit1.Value=1 then Label3.Caption:='1' else
begin
with SpinEdit1 do
begin
s:=0;
for d:=2 to Value do
if Value mod d=0 then
begin
l:=2;
for d2:=2 to d div 2 do
if d mod d2=0 then l:=l+1;
if l=2 then s:=s+1;
end;
end;
SetLength(a,s);
i:=0;
with SpinEdit1 do
for d:=2 to Value do
if Value mod d=0 then
begin
l:=2;
for d2:=2 to d div 2 do
if d mod d2=0 then l:=l+1;
if l=2 then
begin
a[i]:=d;
i:=i+1;
end;
end;

SetLength(b,s);
k:=0;
for i:=0 to high(a) do
begin
s1:=0;
k1:=SpinEdit1.Value;
while k1 mod a[i]=0 do
begin
s1:=s1+1;
k1:=k1 div a[i];
end;
b[k]:=s1;
k:=k+1;
end;
max:=b[0];p:=0;
for j:=1 to high(b) do
if b[j]>max then
begin
max:=b[j]; //p:=j;
end;
n1:=a[0];
for i:=1 to high(a) do
n1:=n1*a[i];
if n1>=max then Label3.Caption:=IntToStr(n1) else
while n1<max do
begin
for i:=0 to high(a) do
begin
n1:=n1*a[i];
b[i]:=b[i]/a[i];
max:=b[i];
end;

Label3.Caption:=IntToStr(n1);
end;
end;

Подскажите,пожалуйста способ заставить программу работать быстрее,если это возможно.
Chidory вне форума Ответить с цитированием
Старый 25.10.2008, 11:52   #2
Min
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 239
По умолчанию

извините...... лень разбираться в вашем коде...... напишите теор. решение.
Min вне форума Ответить с цитированием
Старый 25.10.2008, 12:28   #3
Min
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 239
По умолчанию

предлагаю следущее решение:
1. Разбить число A на простые множители. к примеру если A=24, то эти множители 2*2*2*3
2. запонить колличество максимально встреченных множителей (k) и сам элемент(m). Для A=24, такой множитель "2" встречается 3 раза....
3. перемножить между собой все различные множители... 2*3=6
4. если полученное число меньше k то домножить его на m и повторить пункт 4

Вытоге получим число N
Min вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача на Delphi evrey Общие вопросы Delphi 1 01.06.2008 20:37
Задача в DELPHI. Absent Помощь студентам 7 25.02.2008 15:04
Задача в Delphi Oksana11 Помощь студентам 3 22.12.2007 01:12
Задача на Delphi Gorinicher Помощь студентам 17 22.10.2007 21:49