2 ^ n计算器在pascal中为n = {更大的数字}

时间:2013-05-09 10:03:06

标签: pascal

在我必须这样说之前:请原谅我的英语不好...... 我是学生。我老师给我讲帕斯卡尔课程的问题...... 我必须编写为n ^的大值计算2 ^ n的程序...我写了但是有一个问题...我的程序为大于30的n值返回0 ...我的代码在下面.. 。请帮助我:::先谢谢你...

function control(a: integer): boolean;
var 
   b: boolean;
begin
   if (a >= 10) then b := true
   else b := false;

   control := b;
end;

const
   n = 200000000;

var
   a: array[1..n] of integer;
   i, j, c, t, rsayi: longint; k: string;

begin
   writeln('2^n');
   write('n=');
   read(k);

   a[1] := 1;
   rsayi := 1;
   val(k, t, c);

   for i := 1 to t do
   for j := 1 to t div 2 do
   begin
      a[j] := a[j] * 2;
   end;

   for i := 1 to t div 2 do
   begin
      if control(a[j]) = true then
      begin
         a[j + 1] := a[j + 1] + (a[j] div 10);
         a[j] := a[j] mod 10;
         rsayi := rsayi + 1;
      end;
   end;
   for j := rsayi downto 1 do write(a[j]);
end.

2 个答案:

答案 0 :(得分:1)

第一个(嵌套的)循环在a的每个元素上归结为“t”乘以2。

30乘以2乘以32位整数(2 ^ 31-1的正值,因此2 ^ 31是不可及的)

所以第一个循环不起作用,你可能不得不重新考虑你的策略。

答案 1 :(得分:0)

这是一个快速和脏的程序,用于计算所有2 ^ n到一些给定的,可能很大的n。该程序重复地将数组a中的数字加倍,该数字存储在基数10中;在[1]中具有较低位数。请注意,它并不是特别快,因此将它用于n = 200000000是不明智的。

program powers;

const
   n = 2000;   { largest power to compute }
   m = 700;    { length of array, should be at least log(2)*n }

var
   a: array[1 .. m] of integer;
   carry, s, p, i, j: integer;

begin
   p := 1;
   a[1] := 1;
   for i := 1 to n do
   begin
      carry := 0;
      for j := 1 to p do
      begin
         s := 2*a[j] + carry;
         if s >= 10 then
         begin
            carry := 1;
            a[j] := s - 10
         end
         else
         begin
            carry := 0;
            a[j] := s
         end
      end;
      if carry > 0 then
      begin
         p := p + 1;
         a[p] := 1
      end;
      write(i, ': ');
      for j := p downto 1 do
         write(a[j]);
      writeln
   end
end.