在我必须这样说之前:请原谅我的英语不好...... 我是学生。我老师给我讲帕斯卡尔课程的问题...... 我必须编写为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.
答案 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.