主题:[讨论]超简单高精度题,Matodied 又要麻烦你了...
编程小菜菜
[专家分:90] 发布于 2007-08-02 21:10:00
先来个数组的....
1.打印 1
2 3 4
5 6 7 8 9
................
2.求3^n(0<n<20).
3.给一个N(N<100)位的整数,求这个数的各位数字之积.
4.给一个N(N<100)位的整数,将其不断除以2,直到这个数=1为止.
求每次得到的余数数列
回复列表 (共11个回复)
沙发
bigchen [专家分:1940] 发布于 2007-08-03 08:33:00
1
var
s,m,n,i,j,k,l:integer;
begin
readln(n);m:=-1;l:=2*n-1;
for i:=1 to n do
begin
m:=m+2;
for k:=1 to l do write(' ');
for j:=1 to m do
begin
s:=s+1;
write(' ',s);
end;
l:=l-2;writeln;
end;
end.
板凳
bigchen [专家分:1940] 发布于 2007-08-03 08:34:00
2
var
n,s,i:longint;
begin
readln(n);s:=1;
for i:=1 to n do
s:=s*3;
writeln(s);
end.
3 楼
bigchen [专家分:1940] 发布于 2007-08-03 08:37:00
第一题不算高精度
第二题3^19没有maxlongint大
所以也不算高精度
后两题都是高精度乘法和除法
偷懒,不想编了....
4 楼
Matodied [专家分:7560] 发布于 2007-08-03 13:42:00
2、
TYPE arr = ARRAY[1..1023] OF INTEGER;
FUNCTION gjdmult(x, y: STRING): STRING;
VAR
a, b, s: arr;
l, lx, ly, d, i, j, k, v: INTEGER; z, zz: STRING;
BEGIN
lx := LENGTH(x); ly := LENGTH(y);
FOR i:=1 TO lx + ly DO s[i] := 0;
FOR i:=1 TO lx DO VAL(COPY(x, lx + 1 - i, 1), a[i], k);
FOR i:=1 TO ly DO VAL(COPY(y, ly + 1 - i, 1), b[i], k);
FOR i:=1 TO lx DO BEGIN
FOR j:=1 TO ly DO BEGIN
d := a[i] * b[j]; v := i + j - 1;
s[v] := s[v] + d MOD 10;
s[v + 1] := s[v + 1] + s[v] DIV 10 + d DIV 10;
s[v] := s[v] MOD 10;
END;
END;
IF s[lx + ly] = 0 THEN l := lx + ly - 1 ELSE l := lx + ly;
z := '';
FOR i:=l DOWNTO 1 DO BEGIN
STR(s[i], zz);
z := z + zz;
END;
gjdmult := z;
END;
VAR
i: INTEGER; m, n: BYTE; l, m0: STRING;
BEGIN
m := 3; READLN(n); l := '1'; STR(m, m0);
FOR i:=1 TO n DO BEGIN
l := gjdmult(l, m0);
END;
WRITELN(l);
END.
5 楼
Matodied [专家分:7560] 发布于 2007-08-03 14:05:00
3、
TYPE arr = ARRAY[1..1023] OF INTEGER;
FUNCTION gjdmult(x, y: STRING): STRING;
VAR
a, b, s: arr;
l, lx, ly, d, i, j, k, v: INTEGER; z, zz: STRING;
BEGIN
lx := LENGTH(x); ly := LENGTH(y);
FOR i:=1 TO lx + ly DO s[i] := 0;
FOR i:=1 TO lx DO VAL(COPY(x, lx + 1 - i, 1), a[i], k);
FOR i:=1 TO ly DO VAL(COPY(y, ly + 1 - i, 1), b[i], k);
FOR i:=1 TO lx DO BEGIN
FOR j:=1 TO ly DO BEGIN
d := a[i] * b[j]; v := i + j - 1;
s[v] := s[v] + d MOD 10;
s[v + 1] := s[v + 1] + s[v] DIV 10 + d DIV 10;
s[v] := s[v] MOD 10;
END;
END;
IF s[lx + ly] = 0 THEN l := lx + ly - 1 ELSE l := lx + ly;
z := '';
FOR i:=l DOWNTO 1 DO BEGIN
STR(s[i], zz);
z := z + zz;
END;
gjdmult := z;
END;
VAR
n: STRING[100]; l, t: STRING; ln, i: INTEGER;
BEGIN
READLN(n); ln := LENGTH(n); l := '1';
FOR i:=1 TO ln DO BEGIN
t := COPY(n, i, 1);
l := gjdmult(l, t);
END;
WRITELN(l);
END.
6 楼
编程小菜菜 [专家分:90] 发布于 2007-08-03 17:55:00
谢谢...谢谢大家!
7 楼
编程小菜菜 [专家分:90] 发布于 2007-08-04 18:24:00
555,Matodied,我老师骂我一吨,.....说FUNCTION gjdmult(x, y: STRING): STRING;
'用2个字符串干吗?这题没这么复杂!'.说得我无语..
8 楼
编程小菜菜 [专家分:90] 发布于 2007-08-04 19:56:00
2题有点问题吧?
9 楼
游侠UFO [专家分:1200] 发布于 2007-08-05 21:55:00
[quote]第一题不算高精度
第二题3^19没有maxlongint大
所以也不算高精度
后两题都是高精度乘法和除法
偷懒,不想编了....
[/quote]
倒数第二道可能还算是个高精度,最后一道恐怕就不算了吧?
N<100
直接一while加个div和mod不就出来了,完全不用高精。
10 楼
abcwuhang [专家分:1840] 发布于 2007-08-06 12:24:00
第2题:
program jisuan;
var n:1..19;
begin
readln(n);
writeln(power(3,n));
end.
这是最简单的了,既不用数组也节省空间.
我来回复