常量系数多项式除法(Delphi版)

最近研究二维码时发现有的地方需要进行多项式除法,于是自己写了一个算法,以活动一下脑子。

//初始化数组,赋值0.

procedure InitArray(var bb : array of double);
var
a : integer;
begin
for a := 0 to high(bb) do
begin
bb[a] := 0;
end;
end;

//多项式计算.

procedure CountMultiExpress(var dXiShu1,dXiShu2,dXiShu3,dXiShu4 : array of double;AMaxMiCi:integer);
var
//多项式表达规则:认为输入的都是标准的表达式f(x)=a0*x^0+a1*x^1+a2*x^2+...+an*x^n
//系数从0-20存a0-a20,幂为对应的数组索引
//dXiShu1为分母,dXishu2为分子, 3为商 4为余数。
//这里的计算仅仅支持常数系数的。
dXiShuTmp : array of double;
dTmp1,dTmp2,dMaxMiCi,dMaxXiShu : double;
i,j,iTmpMiCi,iMaxMiCi:integer;

procedure InitArray(var bb : array of double);
var
a : integer;
begin
for a := 0 to high(bb) do
begin
bb[a] := 0;
end;
end;
begin
Setlength(dXiShuTmp,AMaxMiCi);
//获取多项式分子最大幂次和系数。
for i:= 20 downto 0 do
begin
if dXiShu2[i]<>0.0 then
begin
dMaxMiCi := i;
dMaxXiShu := dXiShu2[i];
break;
end;
end;
//计算,从高到低
iMaxMiCi := trunc(dMaxMiCi);
for i:= AMaxMiCi downto iMaxMiCi do
begin
if dXiShu1[i]<> 0.0 then
begin
dTmp1 := dXiShu1[i] / dMaxXiShu;
iTmpMiCi := i - iMaxMiCi;
dXiShu3[iTmpMiCi] := dTmp1;//商.
InitArray(dXiShuTmp);
//分子乘dTmp1
for j := iMaxMiCi downto 0 do
begin
dXishuTmp[j+iTmpMiCi] := dXiShu2[j] * dTmp1;
end;
//做减法分母-dXishuTmp
for j := i downto 0 do
begin
dXishu1[j] := dXishu1[j]-dXishuTmp[j];
end;
end;
end;
//余数
for j := 0 to AMaxMiCi do
begin
dXiShu4[j] := dXiShu1[j];
end;
Setlength(dXiShuTmp,0);
end;

使用:

procedure TForm1.Button5Click(Sender: TObject);
var
dXiShu1,dXiShu2,dXiShu3,dXiShu4 : array[0..20] of double;
strOut1,strOut2:string;
j : integer;
begin
//初始化
InitArray(dXiShu1);
InitArray(dXiShu2);
InitArray(dXiShu3);
InitArray(dXiShu4);
//分母,分子赋值
dXiShu1[0]:= 7;
dXiShu1[1]:= 4;
dXiShu1[2]:= 6;
dXiShu1[3]:= 0;
dXiShu1[4]:= 0;
dXiShu1[5]:= 0;

dXiShu2[0]:= 3;
dXiShu2[1]:= 2;
dXiShu2[2]:= 0;
dXiShu2[3]:= 0;
dXiShu2[4]:= 0;
dXiShu2[5]:= 0;
CountMultiExpress(dXiShu1,dXiShu2,dXiShu3,dXiShu4,20);
//输出结果
strOut1 := '';
strOut2 := '';
for j := 0 to 20 do
begin
//商
if dXiShu3[j] > 0.0 then
begin
strOut2 := ' +'+floattostr(dXiShu3[j])+'x^'+inttostr(j)+' ' + strOut2 ;
end;
if dXiShu3[j] < 0.0 then
begin
strOut2 := ' '+floattostr(dXiShu3[j])+'x^'+inttostr(j)+' ' + strOut2 ;
end;
//余数
if dXiShu4[j] > 0.0 then
begin
strOut1 := ' +'+floattostr(dXiShu4[j])+'x^'+inttostr(j)+' ' + strOut1 ;
end;
if dXiShu4[j] < 0.0 then
begin
strOut1 := ' '+floattostr(dXiShu4[j])+'x^'+inttostr(j)+' ' + strOut1 ;
end;
end;
strOut1 := trim(strOut1);
strOut2 := trim(strOut2);
if strOut1[1]='+' then
strOut1 := copy(strOut1,2,length(strOut1)-1);
if strOut2[1]='+' then
strOut2 := copy(strOut2,2,length(strOut2)-1);
memo3.Lines.Clear();
memo3.Lines.Append('商数:'+ strOut2);
memo3.Lines.Append('余数:'+ strOut1);

end;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值