师傅在吗~~~~~~~~~~~ 调试通过了,可是怎么这么麻烦啊?function calc(mNumberA:string;mNumberB:string):string; Var i,j,K:integer; s1,s2:string; begin i:=length(mNumberA); j:=length(mNumberB); if i>j then begin result:=''; s1:='0'; while j>0 do //判断 mNumberB的字符串是否加完 begin k:=strtoint(mNumberA[i])+strtoint(mNumberB[j])+strtoint(s1); //取两个字符里的数值和进位相加 IF length(inttostr(k))=2 then begin s1:=inttostr(k)[1]; //保留进位数字 s2:=inttostr(k)[2]; end else begin s1:='0'; //进位清0 s2:=inttostr(k)[1]; end; dec(i); dec(j); result:=s2+result; end; while i>0 do // 把mNumberA中前面剩余数字加上进位返回 begin k:=strtoint(mNumberA[i])+strtoint(s1); IF length(inttostr(k))=2 then begin s1:=inttostr(k)[1]; //保留进位数字 s2:=inttostr(k)[2]; end else begin s1:='0'; //进位清0 s2:=inttostr(k)[1]; end; dec(i); result:=s2+result; end; if strtoint(s1)<>0 then result:=s1+result; //补齐最高进位 end else begin result:=''; s1:='0'; while i>0 do //判断长度短的字符串是否加完 begin k:=strtoint(mNumberA[i])+strtoint(mNumberB[j])+strtoint(s1); //取两个字符里的数值和进位相加 IF length(inttostr(k))=2 then begin s1:=inttostr(k)[1]; //保留进位数字 s2:=inttostr(k)[2]; end else begin s1:='0'; //进位清0 s2:=inttostr(k)[1]; end; dec(i); dec(j); result:=s2+result; end; while j>0 do // 把mNumberB中前面剩余数字加上进位返回 begin k:=strtoint(mNumberB[j])+strtoint(s1); IF length(inttostr(k))=2 then begin s1:=inttostr(k)[1]; //保留进位数字 s2:=inttostr(k)[2]; end else begin s1:='0'; //进位清0 s2:=inttostr(k)[1]; end; dec(j); result:=s2+result; end; if strtoint(s1)<>0 then result:=s1+result; //补齐最高进位 end; end; procedure TForm1.Button1Click(Sender: TObject); begin edit1.Text:=calc(edit2.Text,edit3.Text ); end;end.
function Calc(mNumberA: string; mNumberB: string): string; var I, J, K: Integer; S1, S2: string; begin I := Length(mNumberA); J := Length(mNumberB); if I < J then begin //参数、Result当普通变量用 K := I; I := J; J := K; Result := mNumberA; mNumberA := mNumberB; mNumberB := Result; end; Result := ''; S1 := '0'; while J > 0 do begin K := StrToInt(mNumberA[I]) + StrToInt(mNumberB[J]) + StrToInt(S1); if Length(IntToStr(K)) = 2 then begin S1 := IntToStr(K)[1]; //保留进位数字 S2 := IntToStr(K)[2]; end else begin S1 := '0'; //进位清0 S2 := IntToStr(K)[1]; end; Dec(I); Dec(J); Result := S2 + Result; end; while I > 0 do begin K := StrToInt(mNumberA[I]) + StrToInt(S1); if Length(IntToStr(K)) = 2 then begin S1 := IntToStr(K)[1]; //保留进位数字 S2 := IntToStr(K)[2]; end else begin S1 := '0'; //进位清0 S2 := IntToStr(K)[1]; end; Dec(I); Result := S2 + Result; end; if StrToInt(S1) <> 0 then Result := S1 + Result; //补齐最高进位 end;
师傅,我怎么发不出消息了? 我把你程序copy走了,:)
//如下是加小数的情况的算法(*// [算法思维] Step.1 对齐位数 '123.456789' '45678.9' --> '00123.456789' '45678.900000'Step.2 反向顺序计算每个位数 '012.79' '456.71' || |~9 + 1 = 10 (='1') ~7 + 7 + 1 = 15 (='5') .......Step.3 排除无效表达方式 '01.100' -> '1.1' '.9' -> '0.9' '' -> '0' //*) function Calc(mNumberA, mNumberB: string): string; { 返回大数和,包括小数情况 } function Max(mIntA, mIntB: Integer): Integer; { 返回最大值 } begin if mIntA > mIntB then Result := mIntA else Result := mIntB; end; { Max } function DupeString(mStr: string; mCount: Integer): string; { 返回字符复本 } var I: Integer; begin Result := ''; for I := 1 to mCount do Result := Result + mStr; end; { DupeString } function StrLeft(const mStr: string; mDelimiter: string): string; { 返回左分隔字符 } begin Result := Copy(mStr, 1, Pos(mDelimiter, mStr) - 1); end; { StrLeft } function StrRight(const mStr: string; mDelimiter: string): string; { 返回右分隔字符 } begin if Pos(mDelimiter, mStr) <= 0 then Result := '' else Result := Copy(mStr, Pos(mDelimiter, mStr) + Length(mDelimiter), MaxInt); end; { StrRight }var I: Integer; T: Integer; begin Result := ''; if Pos('.', mNumberA) <= 0 then mNumberA := mNumberA + '.'; //没有有小数点补小数点 if Pos('.', mNumberB) <= 0 then mNumberB := mNumberB + '.'; //没有有小数点补小数点 I := Max(Length(StrLeft(mNumberA, '.')), Length(StrLeft(mNumberB, '.'))); //整数部分最大长度 mNumberA := DupeString('0', I - Length(StrLeft(mNumberA, '.'))) + mNumberA; //整数前补0 mNumberB := DupeString('0', I - Length(StrLeft(mNumberB, '.'))) + mNumberB; //整数前补0 T := Max(Length(StrRight(mNumberA, '.')), Length(StrRight(mNumberB, '.'))); //小数部分最大长度 mNumberA := mNumberA + DupeString('0', T - Length(StrRight(mNumberA, '.'))); //小数后补0 mNumberB := mNumberB + DupeString('0', T - Length(StrRight(mNumberB, '.'))); //小数后补0 I := I + T + 1; //计算总长度//小数长度和整数长度加上小数点长度 T := 0; //进位数初始化 for I := I downto 1 do //从后向前扫描 if [mNumberA[I], mNumberB[I]] <> ['.'] then begin //不是小数点时 T := StrToIntDef(mNumberA[I], 0) + T; //累加当前数位 T := StrToIntDef(mNumberB[I], 0) + T; //累加当前数位 Result := IntToStr(T mod 10) + Result; //计算当前数位上的数字 T := T div 10; //计算进位数 end else Result := '.' + Result; //加上小数点 if T <> 0 then Result := IntToStr(T mod 10) + Result; //处理进位数 while Pos('0', Result) = 1 do Delete(Result, 1, 1); //排除整数前无效的0 while Copy(Result, Length(Result), 1) = '0' do Delete(Result, Length(Result), 1); //排除小数后无效的0 if Copy(Result, Length(Result), 1) = '.' then Delete(Result, Length(Result), 1); //排除无效小数点 if Copy(Result, 1, 1) = '.' then Result := '0' + Result; //处理无0小数情况 if (Result = '') then Result := '0'; //处理空字符情况 end;
练习题 3.3 算法命题:无限位数减法(尽量考虑全部情况,负数、小数....) 输入范例:10000000000000,1 输出范例:9999999999999 测试代码: function Calc(mNumberA: string; mNumberB: string): string; begin { 你的代码 } end;procedure TForm1.Button1Click(Sender: TObject); begin Edit3.Text := Calc(Edit1.Text, Edit2.Text); end;
to zswang(伴水)(需要充充电) 呜呜呜呜呜呜呜呜呜呜呜呜 呜呜呜呜师傅收到呜呜呜呜 呜呜呜呜呜呜呜呜呜呜呜呜
参看声明部分 比如:函数IntToStr()在声明中是 function IntToStr(AValue: Integer): string; // ~~~~~~~是IntToStr()不是inttostr() 鼠标移动在标识上系统会提示!
你的名字真有意思.
调试通过了,可是怎么这么麻烦啊?function calc(mNumberA:string;mNumberB:string):string;
Var
i,j,K:integer;
s1,s2:string;
begin
i:=length(mNumberA);
j:=length(mNumberB);
if i>j then
begin
result:='';
s1:='0';
while j>0 do //判断 mNumberB的字符串是否加完
begin
k:=strtoint(mNumberA[i])+strtoint(mNumberB[j])+strtoint(s1);
//取两个字符里的数值和进位相加
IF length(inttostr(k))=2 then
begin
s1:=inttostr(k)[1]; //保留进位数字
s2:=inttostr(k)[2];
end
else
begin
s1:='0'; //进位清0
s2:=inttostr(k)[1];
end;
dec(i);
dec(j);
result:=s2+result;
end;
while i>0 do // 把mNumberA中前面剩余数字加上进位返回
begin
k:=strtoint(mNumberA[i])+strtoint(s1);
IF length(inttostr(k))=2 then
begin
s1:=inttostr(k)[1]; //保留进位数字
s2:=inttostr(k)[2];
end
else
begin
s1:='0'; //进位清0
s2:=inttostr(k)[1];
end;
dec(i);
result:=s2+result;
end;
if strtoint(s1)<>0 then
result:=s1+result; //补齐最高进位
end
else
begin
result:='';
s1:='0';
while i>0 do //判断长度短的字符串是否加完
begin
k:=strtoint(mNumberA[i])+strtoint(mNumberB[j])+strtoint(s1);
//取两个字符里的数值和进位相加
IF length(inttostr(k))=2 then
begin
s1:=inttostr(k)[1]; //保留进位数字
s2:=inttostr(k)[2];
end
else
begin
s1:='0'; //进位清0
s2:=inttostr(k)[1];
end;
dec(i);
dec(j);
result:=s2+result;
end;
while j>0 do // 把mNumberB中前面剩余数字加上进位返回
begin
k:=strtoint(mNumberB[j])+strtoint(s1);
IF length(inttostr(k))=2 then
begin
s1:=inttostr(k)[1]; //保留进位数字
s2:=inttostr(k)[2];
end
else
begin
s1:='0'; //进位清0
s2:=inttostr(k)[1];
end;
dec(j);
result:=s2+result;
end;
if strtoint(s1)<>0 then
result:=s1+result; //补齐最高进位
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
edit1.Text:=calc(edit2.Text,edit3.Text );
end;end.
var
I, J, K: Integer;
S1, S2: string;
begin
I := Length(mNumberA);
J := Length(mNumberB);
if I < J then begin //参数、Result当普通变量用
K := I;
I := J;
J := K;
Result := mNumberA;
mNumberA := mNumberB;
mNumberB := Result;
end; Result := '';
S1 := '0';
while J > 0 do begin
K := StrToInt(mNumberA[I]) + StrToInt(mNumberB[J]) + StrToInt(S1);
if Length(IntToStr(K)) = 2 then begin
S1 := IntToStr(K)[1]; //保留进位数字
S2 := IntToStr(K)[2];
end else begin
S1 := '0'; //进位清0
S2 := IntToStr(K)[1];
end;
Dec(I);
Dec(J);
Result := S2 + Result;
end;
while I > 0 do begin
K := StrToInt(mNumberA[I]) + StrToInt(S1);
if Length(IntToStr(K)) = 2 then begin
S1 := IntToStr(K)[1]; //保留进位数字
S2 := IntToStr(K)[2];
end else begin
S1 := '0'; //进位清0
S2 := IntToStr(K)[1];
end;
Dec(I);
Result := S2 + Result;
end;
if StrToInt(S1) <> 0 then
Result := S1 + Result; //补齐最高进位
end;
我把你程序copy走了,:)
[算法思维]
Step.1 对齐位数
'123.456789'
'45678.9'
-->
'00123.456789'
'45678.900000'Step.2 反向顺序计算每个位数
'012.79'
'456.71'
||
|~9 + 1 = 10 (='1')
~7 + 7 + 1 = 15 (='5')
.......Step.3 排除无效表达方式
'01.100' -> '1.1'
'.9' -> '0.9'
'' -> '0'
//*)
function Calc(mNumberA, mNumberB: string): string; { 返回大数和,包括小数情况 } function Max(mIntA, mIntB: Integer): Integer; { 返回最大值 }
begin
if mIntA > mIntB then
Result := mIntA
else Result := mIntB;
end; { Max } function DupeString(mStr: string; mCount: Integer): string; { 返回字符复本 }
var
I: Integer;
begin
Result := '';
for I := 1 to mCount do
Result := Result + mStr;
end; { DupeString } function StrLeft(const mStr: string; mDelimiter: string): string; { 返回左分隔字符 }
begin
Result := Copy(mStr, 1, Pos(mDelimiter, mStr) - 1);
end; { StrLeft } function StrRight(const mStr: string; mDelimiter: string): string; { 返回右分隔字符 }
begin
if Pos(mDelimiter, mStr) <= 0 then
Result := ''
else Result := Copy(mStr, Pos(mDelimiter, mStr) + Length(mDelimiter), MaxInt);
end; { StrRight }var
I: Integer;
T: Integer;
begin
Result := '';
if Pos('.', mNumberA) <= 0 then mNumberA := mNumberA + '.'; //没有有小数点补小数点
if Pos('.', mNumberB) <= 0 then mNumberB := mNumberB + '.'; //没有有小数点补小数点
I := Max(Length(StrLeft(mNumberA, '.')), Length(StrLeft(mNumberB, '.'))); //整数部分最大长度
mNumberA := DupeString('0', I - Length(StrLeft(mNumberA, '.'))) + mNumberA; //整数前补0
mNumberB := DupeString('0', I - Length(StrLeft(mNumberB, '.'))) + mNumberB; //整数前补0
T := Max(Length(StrRight(mNumberA, '.')), Length(StrRight(mNumberB, '.'))); //小数部分最大长度
mNumberA := mNumberA + DupeString('0', T - Length(StrRight(mNumberA, '.'))); //小数后补0
mNumberB := mNumberB + DupeString('0', T - Length(StrRight(mNumberB, '.'))); //小数后补0
I := I + T + 1; //计算总长度//小数长度和整数长度加上小数点长度
T := 0; //进位数初始化
for I := I downto 1 do //从后向前扫描
if [mNumberA[I], mNumberB[I]] <> ['.'] then begin //不是小数点时
T := StrToIntDef(mNumberA[I], 0) + T; //累加当前数位
T := StrToIntDef(mNumberB[I], 0) + T; //累加当前数位
Result := IntToStr(T mod 10) + Result; //计算当前数位上的数字
T := T div 10; //计算进位数
end else Result := '.' + Result; //加上小数点
if T <> 0 then Result := IntToStr(T mod 10) + Result; //处理进位数
while Pos('0', Result) = 1 do Delete(Result, 1, 1); //排除整数前无效的0
while Copy(Result, Length(Result), 1) = '0' do Delete(Result, Length(Result), 1); //排除小数后无效的0
if Copy(Result, Length(Result), 1) = '.' then Delete(Result, Length(Result), 1); //排除无效小数点
if Copy(Result, 1, 1) = '.' then Result := '0' + Result; //处理无0小数情况
if (Result = '') then Result := '0'; //处理空字符情况
end;
算法命题:无限位数减法(尽量考虑全部情况,负数、小数....)
输入范例:10000000000000,1
输出范例:9999999999999
测试代码:
function Calc(mNumberA: string; mNumberB: string): string;
begin
{ 你的代码 }
end;procedure TForm1.Button1Click(Sender: TObject);
begin
Edit3.Text := Calc(Edit1.Text, Edit2.Text);
end;
呜呜呜呜师傅收到呜呜呜呜
呜呜呜呜呜呜呜呜呜呜呜呜
比如:函数IntToStr()在声明中是
function IntToStr(AValue: Integer): string;
// ~~~~~~~是IntToStr()不是inttostr()
鼠标移动在标识上系统会提示!
//cry
俺在学JAVA那
学的头都J了
呜呜