回 帖 发 新 帖 刷新版面

主题:[原创]PASCAL漏洞????????

绝对让你大吃一惊,一个PASCAL程序连续运行,对同样的输入竟有不同的答案输出,天啊,那我岂不是白写了这程序,紧急求助----------
(一下这个程序按上面所说运行一下)!!!!!!!!!
program canlator;
type ty=array[0..100]of integer;
 var i,j:integer;
 sm,sn:string;m,n:ty;
PROCEDURE xuzheng(var a:ty);
  var i:integer;
  begin
  while (a[a[0]]=0)and(a[0]>1)do
       a[0]:=a[0]-1;
   end;
PROCEDURE add(var a,b:ty);
  var l:ty;i,p:integer;
  begin
  if a[0]>b[0] then begin
                    for i:=1 to a[0] do
                      l[i]:=a[i];
                      l[0]:=a[0]+1;
                       for i:=1 to b[0] do
                         begin
                           p:=l[i]+b[i];
                           l[i]:=p mod 10;
                           l[i+1]:=l[i+1]+p div 10;
                           end;
                    end
  else begin
            for i:=1 to b[0] do
               l[i]:=b[i];
               l[0]:=b[0]+1;
               for i:=1 to a[0] do
                 begin
                  p:=l[i]+a[i];
                  l[i]:=p mod 10;
                  l[i+1]:=l[i+1]+p div 10;
                  end;
                  xuzheng(l);a[0]:=l[0];
                  for i:=1 to l[0] do
                       a[i]:=l[i];
          end;
  end;
 procedure mul(var a:ty;x:integer);
   var p,i:integer;
   begin
    p:=0;
    for i:=1 to a[0] do
     begin
      inc(p,a[i]*x);
     if p>10 then a[i]:=p mod 10 else a[i]:=p;
      p:=p div 10;
     end;
    while p>0 do
     begin
      inc(a[0]);
      if p>10 then a[a[0]]:=p mod 10 else a[a[0]]:=p;
      p:=p div 10;
     end;
     xuzheng(a);
    end;
procedure chen(var a,b:ty);
  var l,t:ty;i,j:integer;
  begin
   for i:=1 to a[0] do l[i]:=0;l[0]:=a[0];
   for i:=1 to b[0] do
     begin
      for j:=1 to a[0] do
         t[j]:=a[j];
      t[0]:=a[0];
      mul(t,b[i]);
      for j:=t[0]+i-1 downto 1+i-1 do
      t[j]:=t[j-i+1];
   for j:=1 to i-1 do
     t[j]:=0;
     t[0]:=t[0]+i-1;
     add(l,t);
   for j:=1 to l[0] do
     a[j]:=l[j];a[0]:=l[0];
    end;
  end;
begin
 writeln('m,n');
 readln(sm);
 readln(sn);
 for i:=1 to length(sm) do
    m[length(sm)-i+1]:=ord(sm[i])-ord('0');
    m[0]:=length(sm);
 for i:=1 to length(sn) do
    n[length(sn)-i+1]:=ord(sn[i])-ord('0');
    n[0]:=length(sn);
 chen(m,n);
 for i:=m[0] downto 1 do
   write(m[i]);
end.[em10][em10][em10][em10][em10]

回复列表 (共13个回复)

沙发

有谁在?????帮忙解释一下

板凳

能把程序的大概意思说一下吗?

3 楼


高精度乘法运算,模拟手工算法T数组用于保存A数组*B数组的第I位(A,B数组都是反向储存的),多次帮忙,真是太谢谢你了!!!!ANGWUY

4 楼

你用哪个编译器?
用了哪些数据?

5 楼

TROUB PASCAL
你试一下,输入
11
11
执行后,答案为121
再输入
11
11
执行后,答案为221
多次输入,答案不一样

6 楼

原因是没做初始化工作,修改后的:
program canlator;
type ty=array[0..100]of integer;
 var i,j:integer;
 sm,sn:string;m,n:ty;
PROCEDURE xuzheng(var a:ty);
  var i:integer;
  begin
  while (a[a[0]]=0)and(a[0]>1)do
       a[0]:=a[0]-1;
   end;
PROCEDURE add(var a,b:ty);
  var l:ty;i,p:integer;
  begin
  fillchar(l,sizeof(l),0);
  if a[0]>b[0] then begin
                    for i:=1 to a[0] do
                      l[i]:=a[i];
                      l[0]:=a[0]+1;
                       for i:=1 to b[0] do
                         begin
                           p:=l[i]+b[i];
                           l[i]:=p mod 10;
                           l[i+1]:=l[i+1]+p div 10;
                           end;
                    end
  else begin
            for i:=1 to b[0] do
               l[i]:=b[i];
               l[0]:=b[0]+1;
               for i:=1 to a[0] do
                 begin
                  p:=l[i]+a[i];
                  l[i]:=p mod 10;
                  l[i+1]:=l[i+1]+p div 10;
                  end;
                  xuzheng(l);a[0]:=l[0];
                  for i:=1 to l[0] do
                       a[i]:=l[i];
          end;
  end;
 procedure mul(var a:ty;x:integer);
   var p,i:integer;
   begin
    p:=0;
    for i:=1 to a[0] do
     begin
      inc(p,a[i]*x);
     if p>10 then a[i]:=p mod 10 else a[i]:=p;
      p:=p div 10;
     end;
    while p>0 do
     begin
      inc(a[0]);
      if p>10 then a[a[0]]:=p mod 10 else a[a[0]]:=p;
      p:=p div 10;
     end;
     xuzheng(a);
    end;
procedure chen(var a,b:ty);
  var l,t:ty;i,j:integer;
  begin
  fillchar(l,sizeof(l),0);
  fillchar(t,sizeof(t),0);
   for i:=1 to a[0] do l[i]:=0;l[0]:=a[0];
   for i:=1 to b[0] do
     begin
      for j:=1 to a[0] do
         t[j]:=a[j];
      t[0]:=a[0];
      mul(t,b[i]);
      for j:=t[0]+i-1 downto 1+i-1 do
      t[j]:=t[j-i+1];
   for j:=1 to i-1 do
     t[j]:=0;
     t[0]:=t[0]+i-1;
     add(l,t);
   for j:=1 to l[0] do
     a[j]:=l[j];a[0]:=l[0];
    end;
  end;
begin
fillchar(m,sizeof(m),0);
fillchar(n,sizeof(n),0);

 writeln('m,n');
 readln(sm);
 readln(sn);
 for i:=1 to length(sm) do
    m[length(sm)-i+1]:=ord(sm[i])-ord('0');
    m[0]:=length(sm);
 for i:=1 to length(sn) do
    n[length(sn)-i+1]:=ord(sn[i])-ord('0');
    n[0]:=length(sn);
 chen(m,n);
 for i:=m[0] downto 1 do
   write(m[i]);
end.

7 楼

太谢谢了!我可得注意这些问题,使用动态变量没有释放也会出现类似的问题
,我怎么就没想起来呢?教训!!!!!!!!

8 楼

在TP中程序结束后变量可能不会被释放,所以要求初始化。

如果在函数或过程中输出没有被初始化的变量,那么结果更离谱,因为函数或过程中所有变量的初始值都是随机的。

9 楼

哦,是这样呀!!!!谢谢

10 楼

这确实是PASCAL的一个漏洞,QB里没有这样的事情发生。
所以好的习惯是把每个变量尤其是数组全部初始化。

我来回复

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