如何计算 分数的加减乘除; ( 积分: 10 )

  • 主题发起人 主题发起人 青云
  • 开始时间 开始时间

青云

Unregistered / Unconfirmed
GUEST, unregistred user!
比如定义分数类型

Tfenshu= record
i:integer; //分子
j:integer; //分母

end;

有两个分数 3/5 ,4/3

现在要计算 3/5 +4/3

该如何实现?
并且把算出来的分数再进行最简分数处理;
 
比如定义分数类型

Tfenshu= record
i:integer; //分子
j:integer; //分母

end;

有两个分数 3/5 ,4/3

现在要计算 3/5 +4/3

该如何实现?
并且把算出来的分数再进行最简分数处理;
 
给一个任意小数 1.6 ,如何把它变成分数 8/5
 
1. 在Delphi里可以进行“运算符”重载吗?,我不知道
2. (小数×10×小数的位数) / (10×小数的位数),再化简
例如: 1.6 = (1.6*10*1) / (10*1)
= 16 / 10
= 8 / 5
 
怎么知道下小数位数,16/10=8/5 这一步你是怎么实现的,问题没有那么简单;
 
1.将小数转换为字符串,再通过定位小数点的位置等字符串操作,可以确定小数的位数
2.关于化简:找出分母和分子的最大公约数即可,有现成的数学算法
 
其实这是个比较简单的问题。我就是希望math.pas有相关函数,或者网上有现成代码;
 
其实这是个比较简单的问题
------------
-_-b


或者网上有现成代码;
------------
>_<bbbb
 
http://bbs.2ccc.com/topic.asp?topicid=162960
 
使用辗转相除法可以求出最大公约数和最小共倍数
如求x,y的最大公约数
if x<y then swap(x,y)
r=x mod y
x=y
y=r
if r=0 then 结束
x就是答案
最小共倍数=两数乘积/最大共约数
 
分数计算是先通分,在约分
Delphi运算符无法重载
 
其实,这些功能我都实现了,关键我是想看看大家没有有效率更高的算法:)
//得到两个数的最大公约数;
function MaxCommonDivisor(iSmall : integer ; iBig : integer) : integer ;
//两个分数相加 ,结果为最简分数
function AddFraction(First : TFraction ; Second : TFraction) : TFraction;
//两个分数相乘 ,结果为最简分数
function MulFraction(First : TFraction ; Second : TFraction) : TFraction;
//两个分数相减 ,结果为最简分数
function SubFraction(First : TFraction ; Second : TFraction) : TFraction;
//两个分数相除 ,结果为最简分数
function DivFraction(First : TFraction ; Second : TFraction) : TFraction;
//把某个浮点型数转换成最简分数; 比如 x:=1.8 ,result:=9/5
function DecimalToFraction(x : Double) : TFraction;
//把某个字符串型分数转换成最简分数; 比如 s:='8/6' ,result:=4/3
function StringToFraction(s : string) : TFraction;
==========

function TAccessNum.AddFraction(First, Second: TFraction): TFraction;
var
tempI : int64;
numerator : int64;
denominator : int64;
begin
numerator:=First.numerator * Second.denominator + First.denominator * Second.numerator;
denominator := First.denominator * Second.denominator;
tempI := MaxCommonDivisor(numerator,denominator);
Result.numerator:=numerator div tempI;
Result.denominator:=denominator div tempI;
end;

function TAccessNum.DecimalToFraction(x: Double): TFraction;
var
str : String;
numerator : int64;
denominator : int64;
n : Integer;
tempI : int64;
begin
str:=floattostr(x);
n:=length(str)- pos('.',str);
numerator:=round(x*power(10,n));
denominator:=round(power(10,n));
tempI := MaxCommonDivisor(numerator,denominator);
Result.numerator:=numerator div tempI;
Result.denominator:=denominator div tempI;
end;

function TAccessNum.StringToFraction(s: string): TFraction;
var
numerator : int64;
denominator : int64;
iLenNumerator:Integer;
iLenDenominator: Integer;
tempI : int64;
begin
iLenDenominator:=pos('/',s)-1;
iLenNumerator:=Length(s)-1-iLenDenominator;
if iLenDenominator=-1 then
begin
Result.numerator:=StrToIntDef(s,0);
result.denominator:=1;
exit;
end;
numerator:=StrToInt64Def(copy(s,1,iLenNumerator),0);
Delete(s,1,iLenNumerator+1);
denominator:=StrToInt64Def(s,1);
tempI := MaxCommonDivisor(numerator,denominator);
Result.numerator:=numerator div tempI;
Result.denominator:=denominator div tempI;
end;



function TAccessNum.DivFraction(First, Second: TFraction): TFraction;
var
tempI : int64;
numerator : int64;
denominator : int64;
begin
numerator:=First.numerator * Second.denominator;
denominator := First.denominator * Second.numerator;
tempI := MaxCommonDivisor(numerator,denominator);
Result.numerator:=numerator div tempI;
Result.denominator:=denominator div tempI;
end;


function TAccessNum.MaxCommonDivisor(iSmall, iBig: integer): integer;
begin
if iBig=0 then MaxCommonDivisor:=iSmall
else MaxCommonDivisor:=MaxCommonDivisor(iBig,iSmall mod iBig);
end;

function TAccessNum.MulFraction(First, Second: TFraction): TFraction;
var
tempI : int64;
numerator : int64;
denominator : int64;
begin
numerator:=First.numerator * Second.numerator;
denominator := First.denominator * Second.denominator;
tempI := MaxCommonDivisor(numerator,denominator);
Result.numerator:=numerator div tempI;
Result.denominator:=denominator div tempI;
end;

function TAccessNum.SubFraction(First, Second: TFraction): TFraction;
var
tempI : int64;
numerator : int64;
denominator : int64;
begin
numerator:=First.numerator * Second.denominator - First.denominator * Second.numerator;
denominator := First.denominator * Second.denominator;
tempI := MaxCommonDivisor(numerator,denominator);
Result.numerator:=numerator div tempI;
Result.denominator:=denominator div tempI;
end;
----------------------------------------------
 
后退
顶部