天啊,数据类型!
有两组数据如下:
var
IntA,IntB:LongInt;
StrC:String;IntA:=12345678901234567890123456789012345678901234567890;
IntB:=12345678901234567890;我的目的是
StrC:=StrToInt64(IntA mod IntB);可是IntA和IntB的数据类型总是出错,高手看看!答对马上给分!
有两组数据如下:
var
IntA,IntB:LongInt;
StrC:String;IntA:=12345678901234567890123456789012345678901234567890;
IntB:=12345678901234567890;我的目的是
StrC:=StrToInt64(IntA mod IntB);可是IntA和IntB的数据类型总是出错,高手看看!答对马上给分!
另外你的StrC:=StrToInt64(IntA mod IntB);语句中的函数是不是写反了!!应该是整数类型转换为字符类型吧!
to:halfdream(哈欠) :怎么自己定义数据类型和乘除算法吧?
to:klyh(风笛) :没有写反,就是要得出这个余数的整数!
to:liner44(毛飞) : 你的数组理论能不能说详细一点,或给个例子呀!
谢谢大家了,分不够再加!
向你这种非常规的用法Borland的程序员们也没想到...
自己编程解决吧, 我帮你想想... 我记得以前看过一篇文章, 有种方法可以用10位计算器算大于10位的乘除运算...
IntB:=12345678901234567890;你是草草的举了个例子, 还是真要算这个数?
如果真是这两个数的话, 口算就能算出来, 余数是1234567890.
(IntA = IntB*E30 + IntB*E10 + 1234567890)
这个不过是一个例子,真正的数字比这个要复杂几十倍,还要大得多,天啊,怎么办?还请各位大哥多帮忙?答对马上给分!
我打算遍一个DLL文件, 用来计算超长整数的四则运算. 我现在已经编好了加法, 可以处理大约10的2亿次方的整数, 这个范围足够你用的了吧. 其他的我有时间再编, 你先把信箱留下, 我编好了发给你, 好吗?
不过可以参考一下, 我用的是AnsiString, 范围比String大.
刚又编好了乘法, 不过现在要好好研究一下了, 楼上推荐的程序好像还能算实数, 呃.. 不错.
用两个字符串输入要算的数,存入两个数组中,一位一位的算,(我以前做的PASCAL代码找找不着了,)注意处理进位和两个加数的位数不一定相同,减法注意正负,乘法注意得数别超过了数组范围。除法注意不一定除得尽,所以到了一定的精度记得停止循环
function LongIO(s: AnsiString): AnsiString; //输入输出倒续转换
var
i: integer;
begin
result:='';
for i:= Length(s) downto 1 do
result:= result+s[i];
end;function FormatIO(s: AnsiString): AnsiString;
var
i: integer;
begin
//去掉头部多余0
i:= 1;
while (i<=Length(s)) and (s[i]='0') do //寻找头部的多余0
inc(i);
s:= Copy(s, i, Length(s)-i+1); result:= s;
end;function LongAdd(A, B: AnsiString): AnsiString;
var
minArray, i, carry: integer;
function myAdd(a, b: char; var carry: integer): char;
var
temp_ord: integer;
begin
temp_ord:= ord(a)+ord(b)+carry; //ASCII码求和
carry:= 0; //清空进位
if temp_ord>=106 then //判断是否进位, 106=ord(0)+ord(0)+10
begin
carry:= 1;
temp_ord:= temp_ord-10; //去掉十位
end;
result:= chr(temp_ord-48);
end;
begin
A:= LongIO(FormatIO(A)); //转换输入量
B:= LongIO(FormatIO(B));
//计算被加数与加数的最小位数作为第一遍的循环次数
if Length(A)>=Length(B) then
minArray:= Length(B)
else
minArray:= Length(A);
//第一次循环开始
carry:= 0; //初始化进位
result:=''; //初始化结果
for i:= 1 to minArray do
result:= result+myAdd(A[i], B[i], carry);
//第二次循环开始, 用于处理位数不等情况下的剩余位
if Length(A)>minArray then
for i:= minArray+1 to Length(A) do
result:= result+myAdd(A[i], '0', carry);
if Length(B)>minArray then
for i:= minArray+1 to Length(B) do
result:= result+myAdd(B[i], '0', carry);
//输出最高位进位
if carry>0 then
result:= result+'1';
result:= FormatIO(LongIO(result)); //转换输出
end;function LongSub(A, B: AnsiString): AnsiString;
var
i, carry, c: integer;
temps: AnsiString;
function Compare(A, B: AnsiString): integer; //0< 1= 2>
var
i: integer;
begin
if Length(A)>Length(B) then
begin
result:= 2;
exit;
end;
if Length(A)<Length(B) then
begin
result:= 0;
exit;
end;
//Length(A)=Length(B)
for i:= Length(A) downto 1 do
begin
if A[i]=B[i] then
continue;
if A[i]>B[i] then
result:= 2
else
result:= 0;
exit;
end;
//A=B
result:= 1;
end;
function mySub(a, b: char; var carry: integer): char;
var
temp_ord: integer;
begin
temp_ord:= ord(a)-ord(b)-carry; //ASCII码求差
carry:= 0; //清空借位
if temp_ord<0 then //判断是否借位
begin
carry:= 1;
temp_ord:= temp_ord+10; //去掉负数
end;
result:= chr(temp_ord+48);
end;
begin
A:= LongIO(FormatIO(A)); //转换输入量
B:= LongIO(FormatIO(B));
//判断被减数与减数, 大的为被减数
c:= Compare(A, B);
case c of
0: begin //A<B
temps:= A;
A:= B;
B:= temps;
end;
1: begin //A=B
result:= '0';
exit;
end;
end;
//第一次循环开始
carry:= 0; //初始化借位
result:=''; //初始化结果
for i:= 1 to Length(B) do //Length(B)=minArray
result:= result+mySub(A[i], B[i], carry);
//第二次循环开始, 用于处理位数不等情况下的剩余位
if Length(A)>Length(B) then
for i:= Length(B)+1 to Length(A) do
result:= result+mySub(A[i], '0', carry);
//输出最高位进位
if c=0 then
result:= result+'-';
result:= FormatIO(LongIO(result)); //转换输出
end;function LongMul(A, B: AnsiString): AnsiString;
var
i, j, carry: integer;
temp_result: array of AnsiString;
function myMul(a, b: char; var carry: integer): string;
var
temp: integer;
begin
temp:= StrToInt(a)*StrToInt(b)+carry;
//处理进位
carry:= temp div 10;
temp:= temp mod 10;
result:= IntToStr(temp);
end;
begin
A:= LongIO(FormatIO(A)); //转换输入量
B:= LongIO(FormatIO(B));
for i:=1 to Length(B) do
begin
carry:= 0; //初始化进位
SetLength(temp_result, i); //设置分步乘积的累加
for j:= 1 to i-1 do //设置移位累加补零
temp_result[i-1]:= temp_result[i-1]+'0';
for j:= 1 to Length(A) do //分步相乘
temp_result[i-1]:= temp_result[i-1]+myMul(B[i], A[j], carry);
//输出最高位进位
if carry>0 then
temp_result[i-1]:= temp_result[i-1]+IntToStr(carry);
end;
//进行累加
result:='0';
for i:= 0 to Length(temp_result)-1 do
result:= LongAdd(result, LongIO(temp_result[i])); //转换输出
result:= FormatIO(result);
end;function LongDiv(A, B: AnsiString; var Remainder: AnsiString): AnsiString;
var
i: integer;
function myDiv(a, b: AnsiString; var Remainder: AnsiString): string;
var
temp: integer; //商
temp_r: AnsiString; //临时余数
begin
temp:= 0;
Remainder:= a;
temp_r:= LongSub(a, b);
while temp_r[1]<>'-' do //没减过头
begin
inc(temp);
Remainder:= temp_r;
temp_r:= LongSub(Remainder, b);
end;
result:= IntToStr(temp);
end;
begin
//除法从高位算起, 所以无需LongIO
A:= FormatIO(A);
B:= FormatIO(B);
Remainder:= ''; //初始化减法余数
result:= ''; //初始化商
for i:=1 to Length(A) do
begin
Remainder:= Remainder+A[i]; //余数加新位
result:= result+myDiv(Remainder, B, Remainder);
end;
result:= FormatIO(result);
Remainder:= FormatIO(Remainder);
end;