誰知到高精度算法(加減乘除)pascal的常規(guī)方法啊? Pascal高精度計算,加減乘除
所謂的高精度運算,是指參與運算的數(shù)(加數(shù),減數(shù),因子……)范圍大大超出了標(biāo)準(zhǔn)數(shù)據(jù)類型(整型,實型)能表示的范圍的運算。例如,求兩個200位的數(shù)的和。這時,就要用到高精度算法了。在這里,我們先討論高精度加法。高精度運算主要解決以下三個問題:
一、加數(shù)、減數(shù)、運算結(jié)果的輸入和存儲
運算因子超出了整型、實型能表示的范圍,肯定不能直接用一個數(shù)的形式來表示。在Pascal中,能表示多個數(shù)的數(shù)據(jù)類型有兩種:數(shù)組和字符串。
數(shù)組:每個數(shù)組元素存儲1位(在優(yōu)化時,這里是一個重點!),有多少位就需要多少個數(shù)組元素;用數(shù)組表示數(shù)的優(yōu)點:每一位都是數(shù)的形式,可以直接加減;運算時非常方便。用數(shù)組表示數(shù)的缺點:數(shù)組不能直接輸入;輸入時每兩位數(shù)之間必須有分隔符,不符合數(shù)值的輸入習(xí)慣;
字符串:字符串的最大長度是255,可以表示255位。用字符串表示數(shù)的優(yōu)點:能直接輸入輸出,輸入時,每兩位數(shù)之間不必分隔符,符合數(shù)值的輸入習(xí)慣;用字符串表示數(shù)的缺點:字符串中的每一位是一個字符,不能直接進行運算,必須先將它轉(zhuǎn)化為數(shù)值再進行運算;運算時非常不方便;
綜合以上所述,對上面兩種數(shù)據(jù)結(jié)構(gòu)取長補短:用字符串讀入數(shù)據(jù),用數(shù)組存儲數(shù)據(jù):
var s1,s2:string;
a,b,c:array [1..260] of integer;
i,l,k1,k2:integer;
begin
write('input s1:');readln(s1);
write('input s2:');readln(s2);
{————讀入兩個數(shù)s1,s2,都是字符串類型}
l:=length(s1);{求出s1的長度,也即s1的位數(shù);有關(guān)字符串的知識。}
k1:=260;
for i:=l downto 1 do
begin
a[k1]:=ord(s1)-48;{將字符轉(zhuǎn)成數(shù)值}
k1:=k1-1;
end;
k1:=k1+1;
{————以上將s1中的字符一位一位地轉(zhuǎn)成數(shù)值并存在數(shù)組a中;低位在后(從第260位開始),高位在前(每存完一位,k1減1),完后,k1指向最高位}
對s2的轉(zhuǎn)化過程和上面一模一樣。
二、運算過程
在往下看之前,大家先列豎式計算35+86。
注意的問題:
(1)運算順序:兩個數(shù)靠右對齊;從低位向高位運算;先計算低位再計算高位;
(2)運算規(guī)則:同一位的兩個數(shù)相加再加上從低位來的進位,成為該位的和;這個和去掉向高位的進位就成為該位的值;如上例:3+8+1=12,向前一位進1,本位的值是2;可借助MOD、DIV運算完成這一步;
(3)最后一位的進位:如果完成兩個數(shù)的相加后,進位位值不為0,則應(yīng)添加一位;
(4)如果兩個加數(shù)位數(shù)不一樣多,則按位數(shù)多的一個進行計算;
if k1>k2 then k:=k1 else k:=k2;
y:=0;
for i:=260 downto k do
begin
x:=a+b+y;
c:=x mod 10;
y:=x div 10;
end;
if y<>0 then begin k:=k-1;c[k]:=y; end;
三、結(jié)果的輸出(這也是優(yōu)化的一個重點)
按運算結(jié)果的實際位數(shù)輸出
for i:=k to 260 do write(c);
writeln;
例子:求兩個數(shù)的加法
program sum;
var s,s1,s2:string;
a,b,c:array [1..260] of integer;
i,l,k1,k2:integer;
begin
write('input s1:');readln(s1);
write('input s2:');readln(s2);
l:=length(s1);
k1:=260;
for i:=l downto 1 do
begin
a[k1]:=ord(s1)-48;
k1:=k1-1;
end;
k1:=k1+1;
l:=length(s2);
k2:=260;
for I+:=l downto 1 do
begin
b[k2]:=ord(s2)-48;
k2:=k2-1;
end;
k2:=k2+1;
if k1>k2 then k:=k2 else k:=k1;
y:=0;
for i:=260 downto k do
begin
x:=a+b+y;
c:=x mod 10;
y:=x div 10;
end;
if y<>0 then begin k:=k-1;c[k]:=y;
end;
for i:=k to 260 do write(c);
writeln;
end.
四、優(yōu)化:
以上的方法的有明顯的缺點:
(1)浪費空間:一個整型變量(-32768~32767)只存放一位(0~9);
(2)浪費時間:一次加減只處理一位;
針對以上問題,我們做如下優(yōu)化:一個數(shù)組元素存放四位數(shù);(integer的最大范圍是32767,5位的話可能導(dǎo)致出界)。具體方法:
l:=length(s1);
k1:=260;
repeat {————有關(guān)字符串的知識}
s:=copy(s1,l-3,4);
val(s,a[k1],code);
k1:=k1-1;
s1:=copy(s1,1,l-4);
l:=l-4;
until l<=0;
k1:=k1+1;
而因為這個改進,算法要相應(yīng)改變:
(1)運算時:不再逢十進位,而是逢萬進位(mod 10000; div 10000);
(2)輸出時:最高位直接輸出,其余各位,要判斷是否足夠4位,不足部分要補0;例如:1,23,2345這樣三段的數(shù),輸出時,應(yīng)該是100232345而不是1234567。
改進后的算法:
program sum;
var s1,s2,s:string;
a,b,c:array [1..260] of integer;
i,l,k1,k2,code:integer;
begin
write('input s1:');readln(s1);
write('input s2:');readln(s2);
l:=length(s1);
k1:=260;
repeat {————有關(guān)字符串的知識}
s:=copy(s1,l-3,4);
val(s,a[k1],code);
k1:=k1-1;
s1:=copy(s1,1,l-4);
l:=l-4;
until l<=0;
k1:=k1+1;
l:=length(s2);
k2:=260;
repeat
s:=copy(s2,l-3,4);
val(s,b[k2],code);
k2:=k2-1;
s2:=copy(s2,1,l-4);
l:=l-4;
until l<=0;
k2:=k2+1;
if k1<k2 then k:=k1 else k:=k2;
y:=0;
for i:=260 downto k do
begin
x:=a+b+y;
c:=x mod 10000;
y:=x div 10000;
end;
if y<>0 then begin k:=k-1;c[k]:=y;end;
write(c[k]);
for i:=k+1 to 260 do
begin
if c<1000 then write('0');
if c<100 then write('0');
if c<10 then write('0');
write(c);
end;
writeln;
end.
減法:和高精度加法相比,減法在差為負(fù)數(shù)時處理的細節(jié)更多一點:當(dāng)被減數(shù)小于減數(shù)時,差為負(fù)數(shù),差的絕對值是減數(shù)減去被減數(shù);在程序?qū)崿F(xiàn)上用一個變量來存儲符號位,用另一個數(shù)組存差的絕對值。
2、算法流程:
(1)讀入被減數(shù)S1,S2(字符串);
(2)置符號位:判斷被減數(shù)是否大于減數(shù):大則將符號位置為空;小則將符號位置為“-”,交換減數(shù)與被減數(shù);
(3)被減數(shù)與減數(shù)處理成數(shù)值,放在數(shù)組中;
(4)運算:
A、取數(shù);
B、判斷是否需要借位;
C、減,將運算結(jié)果放到差數(shù)組相應(yīng)位中;
D、判斷是否運算完成:是,轉(zhuǎn)5;不是,轉(zhuǎn)A;
(5)打印結(jié)果:符號位,第1位,循環(huán)處理第2到最后一位;
3、細節(jié):
▲如何判斷被減數(shù)與減數(shù)的大小:字符串知識
(1)首先將兩個字符串的位數(shù)補成一樣(因為字符串的比較是從左邊對齊的;兩個字符串一樣長才能真正地比較出大小):短的在左邊補0
k1:=length(s1);
k2:=length(s2);
if k1>k2 then for i:=1 to k1-k2 do s2:='0'+s2
else for i:=1 to k2-k1 do s1:='0'+s1;
(2)接著比較大小:直接比較字符串大小
fh:='';
if s1<s2 then begin fh:='-';s:=s1; s1:=s2; s2:=s; end;
{————s1存被減數(shù),fh存符號}
▲將字符串處理成數(shù)值:
l:=length(s1);{求出s1的長度,也即s1的位數(shù);有關(guān)字符串的知識。}
k1:=260;
for i:=l downto 1 do
begin
a[k1]:=ord(s1)-48;{將字符轉(zhuǎn)成數(shù)值}
k1:=k1-1;
end;
k1:=k1+1;
▲運算(減法跟加法比較,減法退位處理跟加法進位處理不一樣):
a.處理退位;
跟加法一樣,在for語句外面先將退位清零,
用被減數(shù)再減去退位,
{注意:由于每一個數(shù)位不一定都得向前一位借位,所以這里退位得清零。例如,234-25,個位需借位,而十位不用}
接著,再判斷,當(dāng)被減數(shù)某一位不夠減時,則需加上前一位退位過來的數(shù)。
{注意:由于這里采用優(yōu)化方法,所以退一位,就等于后一位加上10000。)
最后,再拿一個數(shù)組來存儲兩個減數(shù)的差。
jw:=0;
for i:=260 downto k1 do
begin
a:=a-jw; {此處jw為下一位從I位的借位}
jw:=0; {此處jw為I 位準(zhǔn)備向上一位的借位}
if a<b then
begin
jw:=1;
a:=a+10000;
end;
c:=a-b;
end;
▲打印結(jié)果:
先找到差的第一個非零數(shù),如果差的所有位數(shù)都為零,就直接輸出零。
如果不是,就輸出符號位和差的第一位。
剩下部分,打印補足零:
因為優(yōu)化后的高精度減法,是把每四個數(shù)位分成一段,而每一段則必須有四個
數(shù),當(dāng)有一段不足四個數(shù)時,就得用"0"補足.(如:第一位是'1',第二位是'34',第三位是'345',第四位是'8', 則應(yīng)寫為'1003403450008').注意:第一位不用補零,(如:第一位為'3',則寫成'3').
while (c[k]=0) and (k<=260) do k:=k+1;
if k>260 then write('0')
else begin
write(fh,c[k]);{k是差的第1位;}
for i:=k+1 to 260 do
begin
if c<1000 then write('0');
if c<100 then write('0');
if c<10 then write('0');
write(c);
end;
end;
參考程序:
program Zfjianfa;
const n=25;
var s1,s2,s3,s4,s:string;
a,b,c:array[1..n] of integer;
i,k1,k2,l,code,jw:integer;
cq:char;
begin
readln(s1);
readln(s2);
k1:=length(s1);
k2:=length(s2);
if k1>k2 then for i:=1 to k1-k2 do s2:='0'+s2
else for i:=1 to k2-k1 do s1:='0'+s1;
cq:=' ';
if s1<s2 then begin cq:='-'; s:=s1; s1:=s2; s2:=s; end;
l:=length(s1);
k1:=n;
repeat
s3:=copy(s1,l-3,4);
val(s3,a[k1],code);
k1:=k1-1;
delete(s1,l-3,4);
l:=l-4;
until l<=0;
k1:=k1+1;
i:=length(s2);
k2:=n;
repeat
s4:=copy(s2,i-3,4);
val(s4,b[k2],code);
k2:=k2-1;
delete(s2,i-3,4);
i:=i-4;
until i<=0;
k2:=k2+1;
jw:=0;
for i:=n downto k1 do
begin
a:=a-jw;
jw:=0;
if a<b then begin
jw:=1;
a:=a+10000;
end;
c:=a-b;
end;
while (c[k1]=0) and (k1<=n) do
k1:=k1+1;
if k1>n then writeln('0')
else begin
write(cq,c[k1]);
for i:=k1+1 to n do
begin
if c<1000 then write('0');
if c<100 then write('0');
if c<10 then write('0');
write(c);
end;
end;
writeln;
end.
高精度乘法基本思想和加法一樣。其基本流程如下:
①讀入被乘數(shù)s1,乘數(shù)s2
②把s1、s2分成4位一段,轉(zhuǎn)成數(shù)值存在數(shù)組a,b中;記下a,b的長度k1,k2;
③i賦為b中的最低位;
④從b中取出第i位與a相乘,累加到另一數(shù)組c中;(注意:累加時錯開的位數(shù)應(yīng)是多少位?)
⑤i:=i-1;檢測i值:小于k2則轉(zhuǎn)⑥,否則轉(zhuǎn)④
⑥打印結(jié)果
參考程序:
program chengfa;
const n=100;
type ar=array [1..n] of integer;
var a,b:ar; k1,k2,k:integer;
c:array [1..200] of integer;
s1,s2:string;
procedure fenge(s:string;var d:ar; var kk:integer); {將s分割成四位一組存放在d中,返回的kk值指向d的最高位}
var ss:string;
i,code:integer;
begin
i:=length(s);
kk:=n;
repeat
ss:=copy(s,i-3,4);
val(ss,d[kk],code);
kk:=kk-1;
s:=copy(s,1,i-4);
i:=i-4;
until i<0;
kk:=kk+1;
end;
procedure init;
var i:integer;
begin
for i:=1 to n do begin a:=0; b:=0; end;
for i:=1 to 2*n do c:=0;
write('input 2 numbers:');
readln(s1);
readln(s2);
fenge(s1,a,k1);
fenge(s2,b,k2);
end;
procedure jisuan;
var i,j,m:integer; x,y,z,jw:longint;
begin
i:=n; k:=2*n;
repeat
x:=b; z:=0; m:=k; jw:=0;
for j:=n downto k1 do
begin
y:=a[j];
z:=c[m];
x:=x*y+z+jw;
jw:=x div 10000;
c[m]:=x mod 10000;
m:=m-1;
x:=b;
end;
if jw<>0 then c[m]:=jw else m:=m+1;
i:=i-1;
k:=k-1;
until i<k2;
k:=m;
end;
procedure daying;
var i:integer;
begin
write(c[k]);
for i:=k+1 to 2*n do
begin
if c<1000 then write('0');
if c<100 then write('0');
if c<10 then write('0');
write(c);
end;
writeln;
end;
begin
init;
jisuan;
daying;
end.
教材“基礎(chǔ)編”P87高精乘法參考程序:
program ex3_1;
var
a,b,c:array[0..1000] of word;
procedure init;
var
s:string;
ok,i,j:integer;
begin
readln(s);
a[0]:=length(s);
for i:=1 to a[0] do
val(s[a[0]-i+1],a,ok);
readln(s);
b[0]:=length(s);
b[0]:=length(s);
for i:=1 to b[0] do
val(s[b[0]-i+1],b,ok);
end;
procedure highmul;
var i,j,k:integer;
begin
c[0]:=a[0]+b[0];
for i:=1 to b[0] do
for j:=1 to a[0]+1 do
begin
inc(c[i+j-1],a[j]*b mod 10);
c[i+j]:=c[i+j]+(a[j]*b div 10)+(c[i+j-1] div 10);
c[i+j-1]:=c[i+j-1] mod 10;
end;
end;
procedure print;
var i:integer;
begin
while c[c[0]]=0 do dec(c[0]);
for i:=c[0] downto 1 do
write(c);
writeln;
end;
begin
init;
highmul;
print;
end.
高精度除法:
1).高精度除以整型數(shù)據(jù)(integer);
程序如下:
program HighPrecision3_Multiply1;
const
fn_inp='hp5.inp';
fn_out='hp5.out';
maxlen=100; { max length of the number }
type
hp=record
len:integer; { length of the number }
s:array[1..maxlen] of integer
{ s[1] is the lowest position
s[len] is the highest position }
end;
var
x,y:hp;
z,w:integer;
procedure PrintHP(const p:hp);
var i:integer;
begin
for i:=p.len downto 1 do write(p.s);
end;
procedure init;
var
st:string;
i:integer;
begin
assign(input,fn_inp);
reset(input);
readln(st);
x.len:=length(st);
for i:=1 to x.len do { change string to HP }
x.s:=ord(st[x.len+1-i])-ord('0');
readln(z);
close(input);
end;
procedure Divide(a:hp;b:integer;var c:hp;var d:integer);
{ c:=a div b ; d:=a mod b }
var i,len:integer;
begin
fillchar(c,sizeof(c),0);
len:=a.len;
d:=0;
for i:=len downto 1 do { from high to low }
begin
d:=d*10+a.s;
c.s:=d div b;
d:=d mod b;
end;
while(len>1) and (c.s[len]=0) do dec(len);
c.len:=len;
end;
procedure main;
begin
Divide(x,z,y,w);
end;
procedure out;
begin
assign(output,fn_out);
rewrite(output);
PrintHP(y);
writeln;
writeln(w);
close(output);
end;
begin
init;
main;
out;
end.
2).高精度除以高精度
程序如下:
program HighPrecision4_Multiply2;
const
fn_inp='hp6.inp';
fn_out='hp6.out';
maxlen=100; { max length of the number }
type
hp=record
len:integer; { length of the number }
s:array[1..maxlen] of integer
{ s[1] is the lowest position
s[len] is the highest position }
end;
var
x:array[1..2] of hp;
y,w:hp; { x:input ; y:output }
procedure PrintHP(const p:hp);
var i:integer;
begin
for i:=p.len downto 1 do write(p.s);
end;
procedure init;
var
st:string;
j,i:integer;
begin
assign(input,fn_inp);
reset(input);
for j:=1 to 2 do
begin
readln(st);
x[j].len:=length(st);
for i:=1 to x[j].len do { change string to HP }
x[j].s:=ord(st[x[j].len+1-i])-ord('0');
end;
close(input);
end;
procedure Subtract(a,b:hp;var c:hp); { c:=a-b, suppose a>=b }
var i,len:integer;
begin
fillchar(c,sizeof(c),0);
if a.len>b.len then len:=a.len { get the bigger length of a,b }
else len:=b.len;
for i:=1 to len do { subtract from low to high }
begin
inc(c.s,a.s-b.s);
if c.s<0 then
begin
inc(c.s,10);
dec(c.s[i+1]); { add 1 to a higher position }
end;
end;
while(len>1) and (c.s[len]=0) do dec(len);
c.len:=len;
end;
function Compare(const a,b:hp):integer;
{
1 if a>b
0 if a=b
-1 if a < b
}
var len:integer;
begin
if a.len>b.len then len:=a.len { get the bigger length of a,b }
else len:=b.len;
while(len>0) and (a.s[len]=b.s[len]) do dec(len);
{ find a position which have a different digit }
if len=0 then compare:=0 { no difference }
else compare:=a.s[len]-b.s[len];
end;
procedure Multiply10(var a:hp); { a:=a*10 }
var i:Integer;
begin
for i:=a.len downto 1 do
a.s[i+1]:=a.s;
a.s[1]:=0;
inc(a.len);
while(a.len>1) and (a.s[a.len]=0) do dec(a.len);
end;
procedure Divide(a,b:hp;var c,d:hp); { c:=a div b ; d:=a mod b }
var i,j,len:integer;
begin
fillchar(c,sizeof(c),0);
len:=a.len;
fillchar(d,sizeof(d),0);
d.len:=1;
for i:=len downto 1 do
begin
Multiply10(d);
d.s[1]:=a.s; { d:=d*10+a.s }
{ c.s:=d div b ; d:=d mod b; }
{ while(d>=b) do begin d:=d-b;inc(c.s) end }
while(compare(d,b)>=0) do
begin
Subtract(d,b,d);
inc(c.s);
end;
end;
while(len>1)and(c.s[len]=0) do dec(len);
c.len:=len;
end;
procedure main;
begin
Divide(x[1],x[2],y,w);
end;
procedure out;
begin
assign(output,fn_out);
rewrite(output);
PrintHP(y);
writeln;
PrintHP(w);
writeln;
close(output);
end;
begin
init;
main;
out;
end.
program Add16;
var
s1,s2:string;
l1,l2,L:byte;
i,j,k:integer;
a,b,c:array[1..255]of shortint;
jw,key:integer;
begin
readln(s1); readln(s2);
l1:=length(s1); L2:=length(s2);
fillchar(a,sizeof(a),0);
fillchar(b,sizeof(b),0);
fillchar(c,sizeof(c),0);
for i:=1 to L1 do
begin
if s1[i] in ['0'..'9'] then a[L1-i+1]:=ord(s1[i])-48;
if s1[i] in ['A'..'F'] then a[L1-i+1]:=ord(s1[i])-64+9;
end;
for i:=1 to L2 do
begin
if s2[i] in ['0'..'9'] then b[l2-i+1]:=ord(s2[i])-48;
if s2[i] in ['A'..'Z'] then b[l2-i+1]:=ord(s2[i])-64+9;
end;
if L1>l2 then l:=l1+2 else l:=l2+2;
jw:=0;
for i:=1 to l do
begin
key:=a[i]+b[i]+jw;
jw:=key div 16;
c[i]:=key mod 16;
end;
while c[l]=0 do l:=l-1;
for i:=l downto 1 do
if c[i]>9
then write(chr(c[i]-9+64))
else write(c[i]);
writeln;
readln;
end.
牢呼19330417935: 怎樣用C語言做超大整數(shù)的減法運算 -
隆安縣齒數(shù): ______ 用高精度算法來實現(xiàn),即用數(shù)組或指針來儲存數(shù)字,例如A〔20〕來儲存a ,用B〔20〕來儲存b,這樣a 和b就可以是很大的數(shù),再用一個C〔21〕來儲存結(jié)果,為什么C要21呢,你知道,加法是要近位的,呵呵.這里給出相加的偽代碼,d =0/*用來存儲近位*/,for i=0到19{c=A〔i〕+B〔i〕+d ,d =c/10,c=c%10,C〔i〕=c}if d 不等于0 C〔i+1〕=d ,再逆的輸出C就可以了!編程要學(xué)會思考,現(xiàn)在你可以試試編下高精度乘法,例如可以輸出100的階乘!
牢呼19330417935: 一千位的整數(shù)與一千位的整數(shù)相乘的用C語言怎么編程 -
隆安縣齒數(shù): ______ 這個就是高精度乘法嘛~ 你先用字符串來讀入這兩個數(shù),然后保存到數(shù)組里,從最后一位開始乘,一位位算,就好比我們在紙上列豎式計算一樣
牢呼19330417935: pascal高精度加法計算,我的程序錯哪了 -
隆安縣齒數(shù): ______ while 最后判斷位數(shù)的那一段直接改為 if a[x+1]>0 then inc(x);加法是不會存在太多位數(shù)的,也不會超出最高位+1…… 開頭讀入改為readln(s1);readln(s2); 數(shù)組最好定義...
牢呼19330417935: C語言中關(guān)于指針加減運算中的(pa)+n*sizeof(指針數(shù)據(jù)類型)什么意思?有點不理解,請舉個例子,謝謝! -
隆安縣齒數(shù): ______ int int int 設(shè)在這連續(xù)的內(nèi)存存放3個int類型的數(shù),指針p指向第一個數(shù)(即p中存放有第一個數(shù)的地址(設(shè)為0x10000)),要想p指向第二個數(shù), 0x10000+1x2=0x10002 (一個內(nèi)存單元存放1個字節(jié)的數(shù)據(jù),int占兩個字節(jié),ox10002為第三個數(shù)據(jù)存放的地址),同理,指向第三個數(shù) ,0x10000+2x2=0x10004
牢呼19330417935: 精密度的計算公式
隆安縣齒數(shù): ______ 精密度的計算公式是:精密度表示所測得的一系列數(shù)據(jù)之間的接近程度.相對標(biāo)準(zhǔn)偏差(RSD)=標(biāo)準(zhǔn)偏差(SD)/計算結(jié)果的算術(shù)平均值(X)*100% ,該值通常用來表示分析測試結(jié)果的精密度.X=A-B(X為精密度;A為單次測量的數(shù)值;B為這一系列數(shù)的平均值)相對相差是針對于做兩個平行試驗,用X1減去X2的絕對值除以他們的平均值.測量精密度是指在規(guī)定條件下,對同一或類似被測對象重復(fù)測量所得示值或測得值間的一致程度.常簡稱為精密度.規(guī)定條件可以是重復(fù)性測量條件、期間精密度測量條件或復(fù)現(xiàn)性測量條件.
牢呼19330417935: 大整數(shù)類加減乘除,對100位實現(xiàn) C# 求代碼 -
隆安縣齒數(shù): ______ 給你個32313133353236313431303231363533e58685e5aeb931333264663730例子吧,下面的程序是計算 4444^4444 的值, 代碼如下,你運行一下就知道結(jié)果了,希望對你有幫助. 程序如下: using System; namespace ConsoleApp { ...
牢呼19330417935: 設(shè)有2個10進制的n(n>10)位正整數(shù),設(shè)計其適當(dāng)?shù)臄?shù)據(jù)結(jié)構(gòu)與算法,實現(xiàn)這2個數(shù)的加法 -
隆安縣齒數(shù): ______ pascal 高精度高精度運算是指:當(dāng)參與運算的數(shù)范圍大大超出了標(biāo)準(zhǔn)數(shù)據(jù)類型(整型,實型)能表示的范圍的運算時,通過數(shù)組、字串的形...
牢呼19330417935: 請問這個計算PI的代碼對嗎??longa=10000,b,c=2
隆安縣齒數(shù): ______ 這是網(wǎng)上流行的很厲害的計算PI的程序,當(dāng)然是對的. 數(shù)學(xué)家們研究了數(shù)不清的方法... 下面我們就針對展開后的程序來分析: 要想計算出無限精度的PI,我們需要上述的迭...
牢呼19330417935: c語言中,指針的運算是怎么算的,如pa++ -
隆安縣齒數(shù): ______ pa++就是pa = pa+1但是這個1的字節(jié)數(shù)是根據(jù)pa指針的類型來取值的比如int* pa;那這個1就是sizeof(int)double*pa;那這個1就是sizeof(double)數(shù)組的話,很簡單,就是指向下一個元
牢呼19330417935: Java內(nèi)存泄露問題是什么?
隆安縣齒數(shù): ______ 很多人在談?wù)搩?nèi)存泄露問題,當(dāng)然對于c/c++來說,這個應(yīng)該是老掉牙的問題,但是... Java內(nèi)存泄露情況 JVM回收算法是很復(fù)雜的,我也不知道他們怎么實現(xiàn)的,但是我只...
一、加數(shù)、減數(shù)、運算結(jié)果的輸入和存儲
運算因子超出了整型、實型能表示的范圍,肯定不能直接用一個數(shù)的形式來表示。在Pascal中,能表示多個數(shù)的數(shù)據(jù)類型有兩種:數(shù)組和字符串。
數(shù)組:每個數(shù)組元素存儲1位(在優(yōu)化時,這里是一個重點!),有多少位就需要多少個數(shù)組元素;用數(shù)組表示數(shù)的優(yōu)點:每一位都是數(shù)的形式,可以直接加減;運算時非常方便。用數(shù)組表示數(shù)的缺點:數(shù)組不能直接輸入;輸入時每兩位數(shù)之間必須有分隔符,不符合數(shù)值的輸入習(xí)慣;
字符串:字符串的最大長度是255,可以表示255位。用字符串表示數(shù)的優(yōu)點:能直接輸入輸出,輸入時,每兩位數(shù)之間不必分隔符,符合數(shù)值的輸入習(xí)慣;用字符串表示數(shù)的缺點:字符串中的每一位是一個字符,不能直接進行運算,必須先將它轉(zhuǎn)化為數(shù)值再進行運算;運算時非常不方便;
綜合以上所述,對上面兩種數(shù)據(jù)結(jié)構(gòu)取長補短:用字符串讀入數(shù)據(jù),用數(shù)組存儲數(shù)據(jù):
var s1,s2:string;
a,b,c:array [1..260] of integer;
i,l,k1,k2:integer;
begin
write('input s1:');readln(s1);
write('input s2:');readln(s2);
{————讀入兩個數(shù)s1,s2,都是字符串類型}
l:=length(s1);{求出s1的長度,也即s1的位數(shù);有關(guān)字符串的知識。}
k1:=260;
for i:=l downto 1 do
begin
a[k1]:=ord(s1)-48;{將字符轉(zhuǎn)成數(shù)值}
k1:=k1-1;
end;
k1:=k1+1;
{————以上將s1中的字符一位一位地轉(zhuǎn)成數(shù)值并存在數(shù)組a中;低位在后(從第260位開始),高位在前(每存完一位,k1減1),完后,k1指向最高位}
對s2的轉(zhuǎn)化過程和上面一模一樣。
二、運算過程
在往下看之前,大家先列豎式計算35+86。
注意的問題:
(1)運算順序:兩個數(shù)靠右對齊;從低位向高位運算;先計算低位再計算高位;
(2)運算規(guī)則:同一位的兩個數(shù)相加再加上從低位來的進位,成為該位的和;這個和去掉向高位的進位就成為該位的值;如上例:3+8+1=12,向前一位進1,本位的值是2;可借助MOD、DIV運算完成這一步;
(3)最后一位的進位:如果完成兩個數(shù)的相加后,進位位值不為0,則應(yīng)添加一位;
(4)如果兩個加數(shù)位數(shù)不一樣多,則按位數(shù)多的一個進行計算;
if k1>k2 then k:=k1 else k:=k2;
y:=0;
for i:=260 downto k do
begin
x:=a+b+y;
c:=x mod 10;
y:=x div 10;
end;
if y<>0 then begin k:=k-1;c[k]:=y; end;
三、結(jié)果的輸出(這也是優(yōu)化的一個重點)
按運算結(jié)果的實際位數(shù)輸出
for i:=k to 260 do write(c);
writeln;
例子:求兩個數(shù)的加法
program sum;
var s,s1,s2:string;
a,b,c:array [1..260] of integer;
i,l,k1,k2:integer;
begin
write('input s1:');readln(s1);
write('input s2:');readln(s2);
l:=length(s1);
k1:=260;
for i:=l downto 1 do
begin
a[k1]:=ord(s1)-48;
k1:=k1-1;
end;
k1:=k1+1;
l:=length(s2);
k2:=260;
for I+:=l downto 1 do
begin
b[k2]:=ord(s2)-48;
k2:=k2-1;
end;
k2:=k2+1;
if k1>k2 then k:=k2 else k:=k1;
y:=0;
for i:=260 downto k do
begin
x:=a+b+y;
c:=x mod 10;
y:=x div 10;
end;
if y<>0 then begin k:=k-1;c[k]:=y;
end;
for i:=k to 260 do write(c);
writeln;
end.
四、優(yōu)化:
以上的方法的有明顯的缺點:
(1)浪費空間:一個整型變量(-32768~32767)只存放一位(0~9);
(2)浪費時間:一次加減只處理一位;
針對以上問題,我們做如下優(yōu)化:一個數(shù)組元素存放四位數(shù);(integer的最大范圍是32767,5位的話可能導(dǎo)致出界)。具體方法:
l:=length(s1);
k1:=260;
repeat {————有關(guān)字符串的知識}
s:=copy(s1,l-3,4);
val(s,a[k1],code);
k1:=k1-1;
s1:=copy(s1,1,l-4);
l:=l-4;
until l<=0;
k1:=k1+1;
而因為這個改進,算法要相應(yīng)改變:
(1)運算時:不再逢十進位,而是逢萬進位(mod 10000; div 10000);
(2)輸出時:最高位直接輸出,其余各位,要判斷是否足夠4位,不足部分要補0;例如:1,23,2345這樣三段的數(shù),輸出時,應(yīng)該是100232345而不是1234567。
改進后的算法:
program sum;
var s1,s2,s:string;
a,b,c:array [1..260] of integer;
i,l,k1,k2,code:integer;
begin
write('input s1:');readln(s1);
write('input s2:');readln(s2);
l:=length(s1);
k1:=260;
repeat {————有關(guān)字符串的知識}
s:=copy(s1,l-3,4);
val(s,a[k1],code);
k1:=k1-1;
s1:=copy(s1,1,l-4);
l:=l-4;
until l<=0;
k1:=k1+1;
l:=length(s2);
k2:=260;
repeat
s:=copy(s2,l-3,4);
val(s,b[k2],code);
k2:=k2-1;
s2:=copy(s2,1,l-4);
l:=l-4;
until l<=0;
k2:=k2+1;
if k1<k2 then k:=k1 else k:=k2;
y:=0;
for i:=260 downto k do
begin
x:=a+b+y;
c:=x mod 10000;
y:=x div 10000;
end;
if y<>0 then begin k:=k-1;c[k]:=y;end;
write(c[k]);
for i:=k+1 to 260 do
begin
if c<1000 then write('0');
if c<100 then write('0');
if c<10 then write('0');
write(c);
end;
writeln;
end.
減法:和高精度加法相比,減法在差為負(fù)數(shù)時處理的細節(jié)更多一點:當(dāng)被減數(shù)小于減數(shù)時,差為負(fù)數(shù),差的絕對值是減數(shù)減去被減數(shù);在程序?qū)崿F(xiàn)上用一個變量來存儲符號位,用另一個數(shù)組存差的絕對值。
2、算法流程:
(1)讀入被減數(shù)S1,S2(字符串);
(2)置符號位:判斷被減數(shù)是否大于減數(shù):大則將符號位置為空;小則將符號位置為“-”,交換減數(shù)與被減數(shù);
(3)被減數(shù)與減數(shù)處理成數(shù)值,放在數(shù)組中;
(4)運算:
A、取數(shù);
B、判斷是否需要借位;
C、減,將運算結(jié)果放到差數(shù)組相應(yīng)位中;
D、判斷是否運算完成:是,轉(zhuǎn)5;不是,轉(zhuǎn)A;
(5)打印結(jié)果:符號位,第1位,循環(huán)處理第2到最后一位;
3、細節(jié):
▲如何判斷被減數(shù)與減數(shù)的大小:字符串知識
(1)首先將兩個字符串的位數(shù)補成一樣(因為字符串的比較是從左邊對齊的;兩個字符串一樣長才能真正地比較出大小):短的在左邊補0
k1:=length(s1);
k2:=length(s2);
if k1>k2 then for i:=1 to k1-k2 do s2:='0'+s2
else for i:=1 to k2-k1 do s1:='0'+s1;
(2)接著比較大小:直接比較字符串大小
fh:='';
if s1<s2 then begin fh:='-';s:=s1; s1:=s2; s2:=s; end;
{————s1存被減數(shù),fh存符號}
▲將字符串處理成數(shù)值:
l:=length(s1);{求出s1的長度,也即s1的位數(shù);有關(guān)字符串的知識。}
k1:=260;
for i:=l downto 1 do
begin
a[k1]:=ord(s1)-48;{將字符轉(zhuǎn)成數(shù)值}
k1:=k1-1;
end;
k1:=k1+1;
▲運算(減法跟加法比較,減法退位處理跟加法進位處理不一樣):
a.處理退位;
跟加法一樣,在for語句外面先將退位清零,
用被減數(shù)再減去退位,
{注意:由于每一個數(shù)位不一定都得向前一位借位,所以這里退位得清零。例如,234-25,個位需借位,而十位不用}
接著,再判斷,當(dāng)被減數(shù)某一位不夠減時,則需加上前一位退位過來的數(shù)。
{注意:由于這里采用優(yōu)化方法,所以退一位,就等于后一位加上10000。)
最后,再拿一個數(shù)組來存儲兩個減數(shù)的差。
jw:=0;
for i:=260 downto k1 do
begin
a:=a-jw; {此處jw為下一位從I位的借位}
jw:=0; {此處jw為I 位準(zhǔn)備向上一位的借位}
if a<b then
begin
jw:=1;
a:=a+10000;
end;
c:=a-b;
end;
▲打印結(jié)果:
先找到差的第一個非零數(shù),如果差的所有位數(shù)都為零,就直接輸出零。
如果不是,就輸出符號位和差的第一位。
剩下部分,打印補足零:
因為優(yōu)化后的高精度減法,是把每四個數(shù)位分成一段,而每一段則必須有四個
數(shù),當(dāng)有一段不足四個數(shù)時,就得用"0"補足.(如:第一位是'1',第二位是'34',第三位是'345',第四位是'8', 則應(yīng)寫為'1003403450008').注意:第一位不用補零,(如:第一位為'3',則寫成'3').
while (c[k]=0) and (k<=260) do k:=k+1;
if k>260 then write('0')
else begin
write(fh,c[k]);{k是差的第1位;}
for i:=k+1 to 260 do
begin
if c<1000 then write('0');
if c<100 then write('0');
if c<10 then write('0');
write(c);
end;
end;
參考程序:
program Zfjianfa;
const n=25;
var s1,s2,s3,s4,s:string;
a,b,c:array[1..n] of integer;
i,k1,k2,l,code,jw:integer;
cq:char;
begin
readln(s1);
readln(s2);
k1:=length(s1);
k2:=length(s2);
if k1>k2 then for i:=1 to k1-k2 do s2:='0'+s2
else for i:=1 to k2-k1 do s1:='0'+s1;
cq:=' ';
if s1<s2 then begin cq:='-'; s:=s1; s1:=s2; s2:=s; end;
l:=length(s1);
k1:=n;
repeat
s3:=copy(s1,l-3,4);
val(s3,a[k1],code);
k1:=k1-1;
delete(s1,l-3,4);
l:=l-4;
until l<=0;
k1:=k1+1;
i:=length(s2);
k2:=n;
repeat
s4:=copy(s2,i-3,4);
val(s4,b[k2],code);
k2:=k2-1;
delete(s2,i-3,4);
i:=i-4;
until i<=0;
k2:=k2+1;
jw:=0;
for i:=n downto k1 do
begin
a:=a-jw;
jw:=0;
if a<b then begin
jw:=1;
a:=a+10000;
end;
c:=a-b;
end;
while (c[k1]=0) and (k1<=n) do
k1:=k1+1;
if k1>n then writeln('0')
else begin
write(cq,c[k1]);
for i:=k1+1 to n do
begin
if c<1000 then write('0');
if c<100 then write('0');
if c<10 then write('0');
write(c);
end;
end;
writeln;
end.
高精度乘法基本思想和加法一樣。其基本流程如下:
①讀入被乘數(shù)s1,乘數(shù)s2
②把s1、s2分成4位一段,轉(zhuǎn)成數(shù)值存在數(shù)組a,b中;記下a,b的長度k1,k2;
③i賦為b中的最低位;
④從b中取出第i位與a相乘,累加到另一數(shù)組c中;(注意:累加時錯開的位數(shù)應(yīng)是多少位?)
⑤i:=i-1;檢測i值:小于k2則轉(zhuǎn)⑥,否則轉(zhuǎn)④
⑥打印結(jié)果
參考程序:
program chengfa;
const n=100;
type ar=array [1..n] of integer;
var a,b:ar; k1,k2,k:integer;
c:array [1..200] of integer;
s1,s2:string;
procedure fenge(s:string;var d:ar; var kk:integer); {將s分割成四位一組存放在d中,返回的kk值指向d的最高位}
var ss:string;
i,code:integer;
begin
i:=length(s);
kk:=n;
repeat
ss:=copy(s,i-3,4);
val(ss,d[kk],code);
kk:=kk-1;
s:=copy(s,1,i-4);
i:=i-4;
until i<0;
kk:=kk+1;
end;
procedure init;
var i:integer;
begin
for i:=1 to n do begin a:=0; b:=0; end;
for i:=1 to 2*n do c:=0;
write('input 2 numbers:');
readln(s1);
readln(s2);
fenge(s1,a,k1);
fenge(s2,b,k2);
end;
procedure jisuan;
var i,j,m:integer; x,y,z,jw:longint;
begin
i:=n; k:=2*n;
repeat
x:=b; z:=0; m:=k; jw:=0;
for j:=n downto k1 do
begin
y:=a[j];
z:=c[m];
x:=x*y+z+jw;
jw:=x div 10000;
c[m]:=x mod 10000;
m:=m-1;
x:=b;
end;
if jw<>0 then c[m]:=jw else m:=m+1;
i:=i-1;
k:=k-1;
until i<k2;
k:=m;
end;
procedure daying;
var i:integer;
begin
write(c[k]);
for i:=k+1 to 2*n do
begin
if c<1000 then write('0');
if c<100 then write('0');
if c<10 then write('0');
write(c);
end;
writeln;
end;
begin
init;
jisuan;
daying;
end.
教材“基礎(chǔ)編”P87高精乘法參考程序:
program ex3_1;
var
a,b,c:array[0..1000] of word;
procedure init;
var
s:string;
ok,i,j:integer;
begin
readln(s);
a[0]:=length(s);
for i:=1 to a[0] do
val(s[a[0]-i+1],a,ok);
readln(s);
b[0]:=length(s);
b[0]:=length(s);
for i:=1 to b[0] do
val(s[b[0]-i+1],b,ok);
end;
procedure highmul;
var i,j,k:integer;
begin
c[0]:=a[0]+b[0];
for i:=1 to b[0] do
for j:=1 to a[0]+1 do
begin
inc(c[i+j-1],a[j]*b mod 10);
c[i+j]:=c[i+j]+(a[j]*b div 10)+(c[i+j-1] div 10);
c[i+j-1]:=c[i+j-1] mod 10;
end;
end;
procedure print;
var i:integer;
begin
while c[c[0]]=0 do dec(c[0]);
for i:=c[0] downto 1 do
write(c);
writeln;
end;
begin
init;
highmul;
print;
end.
高精度除法:
1).高精度除以整型數(shù)據(jù)(integer);
程序如下:
program HighPrecision3_Multiply1;
const
fn_inp='hp5.inp';
fn_out='hp5.out';
maxlen=100; { max length of the number }
type
hp=record
len:integer; { length of the number }
s:array[1..maxlen] of integer
{ s[1] is the lowest position
s[len] is the highest position }
end;
var
x,y:hp;
z,w:integer;
procedure PrintHP(const p:hp);
var i:integer;
begin
for i:=p.len downto 1 do write(p.s);
end;
procedure init;
var
st:string;
i:integer;
begin
assign(input,fn_inp);
reset(input);
readln(st);
x.len:=length(st);
for i:=1 to x.len do { change string to HP }
x.s:=ord(st[x.len+1-i])-ord('0');
readln(z);
close(input);
end;
procedure Divide(a:hp;b:integer;var c:hp;var d:integer);
{ c:=a div b ; d:=a mod b }
var i,len:integer;
begin
fillchar(c,sizeof(c),0);
len:=a.len;
d:=0;
for i:=len downto 1 do { from high to low }
begin
d:=d*10+a.s;
c.s:=d div b;
d:=d mod b;
end;
while(len>1) and (c.s[len]=0) do dec(len);
c.len:=len;
end;
procedure main;
begin
Divide(x,z,y,w);
end;
procedure out;
begin
assign(output,fn_out);
rewrite(output);
PrintHP(y);
writeln;
writeln(w);
close(output);
end;
begin
init;
main;
out;
end.
2).高精度除以高精度
程序如下:
program HighPrecision4_Multiply2;
const
fn_inp='hp6.inp';
fn_out='hp6.out';
maxlen=100; { max length of the number }
type
hp=record
len:integer; { length of the number }
s:array[1..maxlen] of integer
{ s[1] is the lowest position
s[len] is the highest position }
end;
var
x:array[1..2] of hp;
y,w:hp; { x:input ; y:output }
procedure PrintHP(const p:hp);
var i:integer;
begin
for i:=p.len downto 1 do write(p.s);
end;
procedure init;
var
st:string;
j,i:integer;
begin
assign(input,fn_inp);
reset(input);
for j:=1 to 2 do
begin
readln(st);
x[j].len:=length(st);
for i:=1 to x[j].len do { change string to HP }
x[j].s:=ord(st[x[j].len+1-i])-ord('0');
end;
close(input);
end;
procedure Subtract(a,b:hp;var c:hp); { c:=a-b, suppose a>=b }
var i,len:integer;
begin
fillchar(c,sizeof(c),0);
if a.len>b.len then len:=a.len { get the bigger length of a,b }
else len:=b.len;
for i:=1 to len do { subtract from low to high }
begin
inc(c.s,a.s-b.s);
if c.s<0 then
begin
inc(c.s,10);
dec(c.s[i+1]); { add 1 to a higher position }
end;
end;
while(len>1) and (c.s[len]=0) do dec(len);
c.len:=len;
end;
function Compare(const a,b:hp):integer;
{
1 if a>b
0 if a=b
-1 if a < b
}
var len:integer;
begin
if a.len>b.len then len:=a.len { get the bigger length of a,b }
else len:=b.len;
while(len>0) and (a.s[len]=b.s[len]) do dec(len);
{ find a position which have a different digit }
if len=0 then compare:=0 { no difference }
else compare:=a.s[len]-b.s[len];
end;
procedure Multiply10(var a:hp); { a:=a*10 }
var i:Integer;
begin
for i:=a.len downto 1 do
a.s[i+1]:=a.s;
a.s[1]:=0;
inc(a.len);
while(a.len>1) and (a.s[a.len]=0) do dec(a.len);
end;
procedure Divide(a,b:hp;var c,d:hp); { c:=a div b ; d:=a mod b }
var i,j,len:integer;
begin
fillchar(c,sizeof(c),0);
len:=a.len;
fillchar(d,sizeof(d),0);
d.len:=1;
for i:=len downto 1 do
begin
Multiply10(d);
d.s[1]:=a.s; { d:=d*10+a.s }
{ c.s:=d div b ; d:=d mod b; }
{ while(d>=b) do begin d:=d-b;inc(c.s) end }
while(compare(d,b)>=0) do
begin
Subtract(d,b,d);
inc(c.s);
end;
end;
while(len>1)and(c.s[len]=0) do dec(len);
c.len:=len;
end;
procedure main;
begin
Divide(x[1],x[2],y,w);
end;
procedure out;
begin
assign(output,fn_out);
rewrite(output);
PrintHP(y);
writeln;
PrintHP(w);
writeln;
close(output);
end;
begin
init;
main;
out;
end.
program Add16;
var
s1,s2:string;
l1,l2,L:byte;
i,j,k:integer;
a,b,c:array[1..255]of shortint;
jw,key:integer;
begin
readln(s1); readln(s2);
l1:=length(s1); L2:=length(s2);
fillchar(a,sizeof(a),0);
fillchar(b,sizeof(b),0);
fillchar(c,sizeof(c),0);
for i:=1 to L1 do
begin
if s1[i] in ['0'..'9'] then a[L1-i+1]:=ord(s1[i])-48;
if s1[i] in ['A'..'F'] then a[L1-i+1]:=ord(s1[i])-64+9;
end;
for i:=1 to L2 do
begin
if s2[i] in ['0'..'9'] then b[l2-i+1]:=ord(s2[i])-48;
if s2[i] in ['A'..'Z'] then b[l2-i+1]:=ord(s2[i])-64+9;
end;
if L1>l2 then l:=l1+2 else l:=l2+2;
jw:=0;
for i:=1 to l do
begin
key:=a[i]+b[i]+jw;
jw:=key div 16;
c[i]:=key mod 16;
end;
while c[l]=0 do l:=l-1;
for i:=l downto 1 do
if c[i]>9
then write(chr(c[i]-9+64))
else write(c[i]);
writeln;
readln;
end.
在PAscal 中 關(guān)于加減乘除 與非 異或 mod div 運算符的優(yōu)先級
http:\/\/218.75.28.230\/wzegit\/Artprint.asp?ID=116 優(yōu)先順序:⑴括號內(nèi)先算 ⑵函數(shù) ⑶運算符優(yōu)先順序 ⑷同級運算按從左到右的次序。注意:1、與大多數(shù)編程語言相反,Pascal語言中and和or運算符的優(yōu)先級比關(guān)系運算符高。因此,如果你的代碼為a < b and c < d,編譯器首先會編譯and運算符,...
相關(guān)評說:
隆安縣齒數(shù): ______ 用高精度算法來實現(xiàn),即用數(shù)組或指針來儲存數(shù)字,例如A〔20〕來儲存a ,用B〔20〕來儲存b,這樣a 和b就可以是很大的數(shù),再用一個C〔21〕來儲存結(jié)果,為什么C要21呢,你知道,加法是要近位的,呵呵.這里給出相加的偽代碼,d =0/*用來存儲近位*/,for i=0到19{c=A〔i〕+B〔i〕+d ,d =c/10,c=c%10,C〔i〕=c}if d 不等于0 C〔i+1〕=d ,再逆的輸出C就可以了!編程要學(xué)會思考,現(xiàn)在你可以試試編下高精度乘法,例如可以輸出100的階乘!
隆安縣齒數(shù): ______ 這個就是高精度乘法嘛~ 你先用字符串來讀入這兩個數(shù),然后保存到數(shù)組里,從最后一位開始乘,一位位算,就好比我們在紙上列豎式計算一樣
隆安縣齒數(shù): ______ while 最后判斷位數(shù)的那一段直接改為 if a[x+1]>0 then inc(x);加法是不會存在太多位數(shù)的,也不會超出最高位+1…… 開頭讀入改為readln(s1);readln(s2); 數(shù)組最好定義...
隆安縣齒數(shù): ______ int int int 設(shè)在這連續(xù)的內(nèi)存存放3個int類型的數(shù),指針p指向第一個數(shù)(即p中存放有第一個數(shù)的地址(設(shè)為0x10000)),要想p指向第二個數(shù), 0x10000+1x2=0x10002 (一個內(nèi)存單元存放1個字節(jié)的數(shù)據(jù),int占兩個字節(jié),ox10002為第三個數(shù)據(jù)存放的地址),同理,指向第三個數(shù) ,0x10000+2x2=0x10004
隆安縣齒數(shù): ______ 精密度的計算公式是:精密度表示所測得的一系列數(shù)據(jù)之間的接近程度.相對標(biāo)準(zhǔn)偏差(RSD)=標(biāo)準(zhǔn)偏差(SD)/計算結(jié)果的算術(shù)平均值(X)*100% ,該值通常用來表示分析測試結(jié)果的精密度.X=A-B(X為精密度;A為單次測量的數(shù)值;B為這一系列數(shù)的平均值)相對相差是針對于做兩個平行試驗,用X1減去X2的絕對值除以他們的平均值.測量精密度是指在規(guī)定條件下,對同一或類似被測對象重復(fù)測量所得示值或測得值間的一致程度.常簡稱為精密度.規(guī)定條件可以是重復(fù)性測量條件、期間精密度測量條件或復(fù)現(xiàn)性測量條件.
隆安縣齒數(shù): ______ 給你個32313133353236313431303231363533e58685e5aeb931333264663730例子吧,下面的程序是計算 4444^4444 的值, 代碼如下,你運行一下就知道結(jié)果了,希望對你有幫助. 程序如下: using System; namespace ConsoleApp { ...
隆安縣齒數(shù): ______ pascal 高精度高精度運算是指:當(dāng)參與運算的數(shù)范圍大大超出了標(biāo)準(zhǔn)數(shù)據(jù)類型(整型,實型)能表示的范圍的運算時,通過數(shù)組、字串的形...
隆安縣齒數(shù): ______ 這是網(wǎng)上流行的很厲害的計算PI的程序,當(dāng)然是對的. 數(shù)學(xué)家們研究了數(shù)不清的方法... 下面我們就針對展開后的程序來分析: 要想計算出無限精度的PI,我們需要上述的迭...
隆安縣齒數(shù): ______ pa++就是pa = pa+1但是這個1的字節(jié)數(shù)是根據(jù)pa指針的類型來取值的比如int* pa;那這個1就是sizeof(int)double*pa;那這個1就是sizeof(double)數(shù)組的話,很簡單,就是指向下一個元
隆安縣齒數(shù): ______ 很多人在談?wù)搩?nèi)存泄露問題,當(dāng)然對于c/c++來說,這個應(yīng)該是老掉牙的問題,但是... Java內(nèi)存泄露情況 JVM回收算法是很復(fù)雜的,我也不知道他們怎么實現(xiàn)的,但是我只...