|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу. Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста". Название темы слишком короткое или не отражает сути вашего вопроса. Тема исчерпала себя, помните, один вопрос - одна тема Прочитайте правила и заново правильно создайте тему. |
|
Опции темы | Поиск в этой теме |
24.12.2006, 22:00 | #1 |
Игрок
Форумчанин
Регистрация: 29.10.2006
Сообщений: 367
|
Предложите самый быстрый алгоритм!
Привет всем! Парни, сегодня был на городской олимпиаде, ток вот, там задание было написать программу которая выводит все "N" значные числа Армстронга! Кто не знает что это такое, объясняю на примере: короче 153 - число Армстронга, потому что 153=1^3+5^3+3^3 (5^3 это пять в степени три) степень - это количество цыфр в числе. Значит так: входные данные: длина числа "n", 1<n<10, выходные: сами числа! О как! Сам не понял че написал.... Ну так вот, эту задачу решил я на Delphi и один паренек на QBasiс-е и надо сказать у него работала на много быстрее. Алгоритм у нас был один и тот же. Парни предложите пожалуйста какой нибудь шустрый алгоритм, а то у меня на n=5 минут пять бился. Короче, если вы ничего не придумаете я приложу свой алгоритм, попробуем его аптимизировать, но мне хотелось бы еще выши посмотреть.
Жизнь всегда игра. Но смерть - не всегда поражение.
#define true (Math.random()>0.5) //Удачной отладки |
25.12.2006, 02:35 | #2 |
Андрей
Форумчанин
Регистрация: 21.11.2006
Сообщений: 457
|
Вот пусть не самый красивый, но зато на 100% рабочий код. На Форме лежат Edit1 для ввода длины числа, ListBox1 для вывода результата и Button1 - куда уж без нее .
Код:
ICQ: 5311314
[SIGPIC][/SIGPIC] Последний раз редактировалось AVer; 25.12.2006 в 02:43. |
25.12.2006, 07:49 | #3 |
Delphi/C++/C#
Участник клуба
Регистрация: 29.10.2006
Сообщений: 1,972
|
вот код Aver, переделаный:
Код:
Думаю мы уже неплохо оптимизировали Число 5 - результат около секунды, чуть больше. Число 7 - результат 1 мин 10 сек вот полученные числа: 1741725 4210818 9800817 9926315 Последний раз редактировалось zetrix; 09.01.2007 в 18:45. |
25.12.2006, 21:01 | #4 | |
Форумчанин
Регистрация: 10.11.2006
Сообщений: 189
|
Цитата:
Тут ошибка: to round(exp(N*ln(i)))-1 Должно быть to round(exp(N*ln(10)))-1 //точно, просто косячнулся. zetrix Последний раз редактировалось zetrix; 09.01.2007 в 18:47. |
|
26.12.2006, 10:29 | #5 |
Студент
Форумчанин
Регистрация: 10.11.2006
Сообщений: 196
|
ПК: AMD AthlonXP 3500+ (2200Mhz)
время - 7 сек числа: 1741725 4210818 9800817 9926315 Код: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; a:array[0..9]of longint; c: PChar; implementation {$R *.dfm} Function Armstrong(X:Integer):Boolean; Var i,m: Integer; s: string; Begin m:=0; s:=inttostr(x); for i:=1 to length(s) do m:=m+a[strtoint(s[i])]; if x=m then Armstrong:=true; end; procedure TForm1.Button1Click(Sender: TObject); var i,n: integer; begin c:=''; n:=StrToInt(Edit1.Text); a[0]:=0; a[1]:=1; for i:=2 to 9 do a[i]:=round(exp(N*ln(i))); For i:=round(exp((N-1)*ln(10))) to round(exp(N*ln(10)))-1 do If Armstrong(i) then c:=PChar(c+IntToStr(i)+' '+#13#10); ShowMessage(c); end; end. P.S. To Zetrix: При каждом проходе вызывать функцию TListBox.Items.Add() занимает приличное время - я модифицировал твой код.
Visita Interiorem Terrae Rectificando Operae Lapidem...
|
26.12.2006, 17:12 | #6 |
Форумчанин
Регистрация: 10.11.2006
Сообщений: 189
|
Если уже говорить о дополнительной оптимизации,
то функцию Armstrong тоже можно модифицировать сразу же вместо Код:
Код:
дальше можно избавиться от inttostr и strtoint, которые, по моему мнению должны прилично замедлять работу (особенно при большом N) вот мой вариант (пишу на работе - в блокноте, так что сильно не пинайте если ошибки будут). Код:
Если ещё подумать, то можно Armstrong на асме написать :-) |
26.12.2006, 22:44 | #7 |
Игрок
Форумчанин
Регистрация: 29.10.2006
Сообщений: 367
|
По идее алгоритм у меня такой же, но в виду отсутствия в Delphi функции возведения числа в степень (или я ее просто не знаю), писал сам, но вынес ее в отдельную функцию. Наверное на этом и был главный тормоз.... Да и комп не очень...600 Мгц (не больше).
Жизнь всегда игра. Но смерть - не всегда поражение.
#define true (Math.random()>0.5) //Удачной отладки |
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Какой самый быстрый метод заполнения массива, например двухмерного? | SkAndrew | Общие вопросы Delphi | 11 | 29.05.2008 13:23 |
Быстрый алгоритм для вычисления синуса | RIO | Помощь студентам | 10 | 17.12.2007 14:33 |
Самый крутой сайт | Alar | Свободное общение | 3 | 05.06.2007 08:40 |