⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 新建 文本文档 (9).txt

📁 大整数的运算,我再网上找刀的一些,大家一起分享
💻 TXT
字号:
uses Math;

function StrLeft( //取左边的字符串
mStr: string; //原字符串
mDelimiter: string; //分隔符
mIgnoreCase: Boolean = False //是否忽略大小写
): string; //返回第一个分隔符左边的字符串
begin
if mIgnoreCase then
Result := Copy(mStr, 1, Pos(UpperCase(mDelimiter), UpperCase(mStr)) - 1)
else Result := Copy(mStr, 1, Pos(mDelimiter, mStr) - 1);
end; { StrLeft }

function StrRight( //取右边的字符串
mStr: string; //原字符串
mDelimiter: string; //分隔符
mIgnoreCase: Boolean = False //是否忽略大小写
): string; //返回第一个分隔符右边的字符串
begin
if mIgnoreCase then
begin
if Pos(UpperCase(mDelimiter), UpperCase(mStr)) > 0 then
Result := Copy(mStr, Pos(UpperCase(mDelimiter), UpperCase(mStr)) +
Length(mDelimiter), MaxInt)
else Result := '';
end else
begin
if Pos(mDelimiter, mStr) > 0 then
Result := Copy(mStr, Pos(mDelimiter, mStr) + Length(mDelimiter), MaxInt)
else Result := '';
end;
end; { StrRight }

function IntegerFullZero( //对齐前补0
mInteger: string; //整数字符串
mLength: Integer //总长度
): string; //返回补0后的整数字符串
begin
Result := StringOfChar('0', mLength - Length(mInteger)) + mInteger;
end; { IntegerFullZero }

function IntegerCompare( //比较两个整数
mIntegerA: string; //整数1
mIntegerB: string //整数2
): Integer; //返回比较的值 +1、0、-1
var
I: Integer;
begin
I := Max(Length(mIntegerA), Length(mIntegerB)); //整数部分最大
mIntegerA := IntegerFullZero(mIntegerA, I);
mIntegerB := IntegerFullZero(mIntegerB, I);
Result := CompareText(mIntegerA, mIntegerB);
end; { IntegerCompare }

function IntegerAdd( //无限整数加法
mIntegerA: string; //整数1
mIntegerB: string //整数2
): string; //返回两个整数的和
var
I: Integer;
T: Integer;
begin
Result := '';
I := Max(Length(mIntegerA), Length(mIntegerB)); //整数部分最大
mIntegerA := IntegerFullZero(mIntegerA, I); //对齐前补0
mIntegerB := IntegerFullZero(mIntegerB, I); //对齐前补0
T := 0; //进位数初始
for I := I downto 1 do //从后向前扫描
begin
T := StrToIntDef(Copy(mIntegerA, I, 1), 0) + T; //累加当前数位
T := StrToIntDef(Copy(mIntegerB, I, 1), 0) + T; //累加当前数位
Result := IntToStr(T mod 10) + Result; //计算当前数位上的数字
T := T div 10; //计算进位数
end;
if T <> 0 then Result := IntToStr(T mod 10) + Result; //处理进位数
while (Pos('0', Result) = 1) and (Result <> '0') do Delete(Result, 1, 1); //排除整数前无效的0
end; { IntegerAdd }

function IntegerSub( //无限整数减法
mIntegerA: string; //整数1
mIntegerB: string //整数2
): string; //返回两个整数的积
var
I: Integer;
T: Integer;
begin
Result := '';
I := Max(Length(mIntegerA), Length(mIntegerB)); //整数部分最大
mIntegerA := IntegerFullZero(mIntegerA, I); //对齐前补0
mIntegerB := IntegerFullZero(mIntegerB, I); //对齐前补0
if mIntegerA < mIntegerB then Exit;
T := 0; //进位数初始
for I := I downto 1 do //从后向前扫描
begin
T := StrToIntDef(Copy(mIntegerA, I, 1), 0) - T; //累加当前数位
T := T - StrToIntDef(Copy(mIntegerB, I, 1), 0); //累加当前数位
Result := IntToStr((T + 10) mod 10) + Result; //计算当前数位上的数字
if T >= 0 then T := 0 else T := 1;
end;
while (Pos('0', Result) = 1) and (Result <> '0') do Delete(Result, 1, 1); //排除整数前无效的0
end; { IntegerSub }

function IntegerDivMod( //无限整数除法
mIntegerA: string; //整数1
mIntegerB: string; //整数2
var nDiv: string; //返回除数
var nMod: string //返回余数
): Boolean; //返回两个整数的积
var
T: string;
K: string;
begin
Result := False;
if mIntegerB = '0' then Exit;
Result := True;
nDiv := '0';
while IntegerCompare(mIntegerA, mIntegerB) >= 0 do
begin
T := mIntegerB;
K := '1';
while IntegerCompare(mIntegerA, T + '0') >= 0 do
begin
T := T + '0';
K := K + '0';
end;
mIntegerA := IntegerSub(mIntegerA, T);
nDiv := IntegerAdd(nDiv, K);
end;
nMod := mIntegerA;
end; { IntegerDivMod }

function NumberExpression( //处理科学计数表达式
mExpression: string //科学表达式
): string; //返回常规数字表达式
var
vExponent: Integer;
vBase: string;
L: Integer;
begin
Result := '';
vBase := StrLeft(mExpression, 'e', True);
vExponent := StrToIntDef(StrRight(mExpression, 'e', True), 0);
L := Length(StrRight(vBase, '.'));
vBase := StringReplace(vBase, '.', '', [rfReplaceAll]);
Result := vBase + StringOfChar('0', vExponent - L);
end; { NumberExpression }

procedure TForm1.Button1Click(Sender: TObject);
var
vDiv, vMod: string;
begin
IntegerDivMod(NumberExpression('4.71012869724624E27'), '65', vDiv, vMod);
Caption := vMod;
end;


postren 发表于 2006-4-20 16:25:06 

//=========================================================================
// Function: 整数的整数次方 
// Input: Base基数,Exp幂 如Base=9,Exp=27表示9的27次方
//Output: 结果字符串
//=========================================================================
//
function BigIntPower(const Base, Exp: Integer): string;
const
BUF_SIZE = 1024; //根据需要设置数组大小
var
Buf: array [0..BUF_SIZE-1] of Integer;
I, J, tmpInt, len: Integer;
begin
Result := '';
FillMemory(@Buf, SizeOf(Buf), 0);
tmpInt := Base;
len := 0;
for I := 0 to BUF_SIZE -1 do
begin
Inc(len);
Buf[I] := tmpInt mod 10;
tmpInt := tmpInt div 10;
if tmpInt = 0 then Break;
end;
for I := 1 to Exp - 1 do
begin
for J := 0 to BUF_SIZE -1 do
begin
Buf[J] := Buf[J] * Base;
end;
for J := 0 to BUF_SIZE -2do
begin
tmpInt := Buf[J];
Buf[J] := tmpInt mod 10;
Buf[J + 1] := Buf[J + 1] + tmpInt div 10;
end;
end;
for J := BUF_SIZE-1 downto 0 do
begin
if Buf[J] <> 0 then
begin
Len := J;
Break;
end;
end;
for J := Len downto 0 do
begin
Result := Result + Format('%d', [Buf[J]]);
end;
end;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -