Консультация № 61223
04.11.2006, 01:33
0.00 руб.
0 3 2
Доброе время суток, уважаемые эксперты.
появилась такая задача: Даны два числа A и B (числа от1 до 100), нужно возвести число А в степень В, а В в степень А и найти их разницу, но при значениях 99 и 100 результат получается 199 значным.
Подскажите как работать с такими числами(BCD- в делфи только 64 знака).
Зарание благодарен.

Приложение:
Премя выполнения программы должно быть меньше 1сек.

Обсуждение

Неизвестный
04.11.2006, 06:42
общий
это ответ
Здравствуйте, Вилков Николай Юрьевич/Twister!
Для работы с очень большыми числами нужно применять "длинную" арифметику. Более подробно об етом вопросе смотрите вопрос №61067. В приложении написан код, которий возносит число 9 в любую степень. Время подношения в степень 1000 равна примерно 2 сек (на Duron 800). Думаю, по етому примеру вы сможете сделать то, что вам нужно. Если возникнут вопросы, пишите мне на личную пошту - буду рад помочь.

Приложение:
Unit1.pas:unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, XPMan, ComCtrls;type TForm1 = class(TForm) Edit1: TEdit; Button1: TButton; Edit2: TEdit; Edit3: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; XPManifest1: TXPManifest; UpDown1: TUpDown; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);var q,kin:string;i,j,rez,pre,cyf,rez1,k,l,el:longint;beginq:=‘1‘;j:=strtoint(edit2.Text);el:=strtoint(edit3.Text);button1.Enabled:=false;for i:=1 to j do begin pre:=0; kin:=‘‘; l:=length(q); for k:=1 to l do begin cyf:=strtoint(q[l-k+1]); cyf:=cyf*el; rez:=cyf mod 10+pre; rez1:=rez mod 10; if rez<=9 then pre:=cyf div 10 else pre:=cyf div 10+1; kin:=inttostr(rez1)+kin; Application.ProcessMessages; end; if pre<>0 then kin:=inttostr(pre)+kin; q:=kin; label4.Caption:=inttostr(i); end; edit1.Text:=q; button1.Enabled:=true; label4.Caption:=‘Розрядність: ‘+inttostr(length(q));end;end.#####################################Unit1.dfm:object Form1: TForm1 Left = 279 Top = 164 BorderIcons = [biSystemMenu, biMinimize] BorderStyle = bsSingle Caption = #1055#1110#1076#1085#1077#1089#1077#1085#1085#1103‘ ‘#1076#1086‘ ‘#1089#1090#1077#1087#1077#1085#1103 ClientHeight = 94 ClientWidth = 311 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = ‘MS Sans Serif‘ Font.Style = [] OldCreateOrder = False PixelsPerInch = 96 TextHeight = 13 object Label1: TLabel Left = 8 Top = 48 Width = 35 Height = 13 Caption = #1063#1080#1089#1083#1086‘:‘ end object Label2: TLabel Left = 112 Top = 48 Width = 41 Height = 13 Caption = #1057#1090#1077#1087#1110#1085#1100‘:‘ end object Label3: TLabel Left = 8 Top = 4 Width = 55 Height = 13 Caption = #1056#1077#1079#1091#1083#1100#1090#1072#1090‘:‘ end object Label4: TLabel Left = 184 Top = 48 Width = 65 Height = 13 Caption = #1056#1086#1079#1088#1103#1076#1085#1110#1089#1090#1100‘:‘ end object Edit1: TEdit Left = 8 Top = 20 Width = 297 Height = 21 TabOrder = 0 end object Button1: TButton Left = 184 Top = 64 Width = 121 Height = 21 Caption = #1055#1091#1089#1082‘!‘ TabOrder = 1 OnClick = Button1Click end object Edit2: TEdit Left = 112 Top = 64 Width = 33 Height = 21 TabOrder = 2 Text = ‘1‘ end object Edit3: TEdit Left = 8 Top = 64 Width = 81 Height = 21 ReadOnly = True TabOrder = 3 Text = ‘9‘ end object UpDown1: TUpDown Left = 145 Top = 64 Width = 17 Height = 21 Associate = Edit2 Position = 1 TabOrder = 4 end object XPManifest1: TXPManifest Left = 272 endend
Неизвестный
04.11.2006, 13:02
общий
А если использовать "быстрое возведение в степень" и "быстрое умножение многочленов", то можно ускорить время работы % на 30.
Неизвестный
04.11.2006, 18:34
общий
это ответ
Здравствуйте, Вилков Николай Юрьевич/Twister!
В модуле math.pas esti функция power работающая с типом extended с разрядностью до 10^4950.
Форма ответа