回 帖 发 新 帖 刷新版面

主题:[讨论]超简单高精度题,Matodied 又要麻烦你了...

先来个数组的....
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个回复)

沙发

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.

板凳

2
var
  n,s,i:longint;
begin
  readln(n);s:=1;
  for i:=1 to n do
    s:=s*3;
  writeln(s);
end.

3 楼

第一题不算高精度
第二题3^19没有maxlongint大
所以也不算高精度
后两题都是高精度乘法和除法
偷懒,不想编了....

4 楼

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 楼

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 楼

谢谢...谢谢大家!

7 楼

555,Matodied,我老师骂我一吨,.....说FUNCTION gjdmult(x, y: STRING): STRING;
'用2个字符串干吗?这题没这么复杂!'.说得我无语..

8 楼

2题有点问题吧?

9 楼

[quote]第一题不算高精度
第二题3^19没有maxlongint大
所以也不算高精度
后两题都是高精度乘法和除法
偷懒,不想编了....
[/quote]

倒数第二道可能还算是个高精度,最后一道恐怕就不算了吧?
N<100

直接一while加个div和mod不就出来了,完全不用高精。

10 楼

第2题:
program jisuan;
var n:1..19;
begin
  readln(n);
  writeln(power(3,n));
end.
这是最简单的了,既不用数组也节省空间.

我来回复

您尚未登录,请登录后再回复。点此登录或注册