【发布时间】:2018-08-26 15:30:29
【问题描述】:
我已经编写了两个程序来查找数字的质因数,一个在 python 中,一个在 pascal 中。我想分解 600851475143; python程序立即分解它。但是,帕斯卡没有在合理的时间内完成。是否与不同的编程语言或我如何用 Pascal 编码有关?我在 python 中使用了递归,但在 pascal 中没有。为什么 pascal 程序也不能立即完成?
蟒蛇:
def findLowestFactor(num, factors=None):
if factors:
start = factors[-1]
else:
start = 2
for i in range(start, int(num)):
if num%i == 0:
return i
else:
return False
def findPrimeFactors(num, factors=None):
if factors is None:
factors = []
factor = findLowestFactor(num, factors)
if factor:
factors.append(factor)
findPrimeFactors(num/factor, factors)
return factors
else:
factors.append(int(num))
return factors
if __name__ == "__main__":
while True:
num = int(input("Please enter a number: "))
factors = findPrimeFactors(num)
print(*factors)
帕斯卡:
program Primes;
var
input:string;
num:integer;
error:integer;
factor:integer;
factors:array of integer;
found: boolean;
start:integer;
x:integer;
begin
writeln(600851475143);
(*Repeat untill exit*)
while true do
begin
(*Repeat untill valid input*)
repeat
write('Enter a number: ');
readln(input);
val(input, num, error);
if error = 1 then
writeln('Not an integer');
until error = 0;
writeln;
(*set up list*)
SetLength(factors, 0);
factor := 0;
found := false;
(*while num is not prime*)
while found = false do
begin
(*start from largest factor found for efficiency*)
if length(factors) > 0 then
start := factors[length(factors)-1]
else
start := 2;
(*loop through numbers from number in start var to current num*)
for factor := start to num do
begin
(*if there are no more factors*)
if num / factor = 1 then
begin;
(*add final factor to list*)
SetLength(factors, length(factors)+1);
factors[length(factors)-1] := factor;
(*break out of the loop*)
found := True;
end
(*if factor is found*)
else if num mod factor = 0 then
begin
(*divide num by found factor*)
num := num div factor;
(*add the factor*)
SetLength(factors, length(factors)+1);
factors[length(factors)-1] := factor;
(*break for efficiency*)
Break;
end;
end;
end;
write('Prime Factors: ');
for x:= 0 to length(factors)-1 do
write(factors[x], ' ');
writeln;
writeln;
end;
end.
【问题讨论】:
-
很难说。你用的是哪个帕斯卡?此外,Python 代码结构良好,而 Pascal 代码几乎是一个块。该方法似乎也有所不同,因此可以很好地解释这种差异。另请注意,600851475143 大于 32 位,因此如果整数在 Pascal 中为 32 位,它可能无法按预期工作。 Python 可能使用正确的数据类型,具体取决于您给它的数字。所以可能有几个因素。
-
FWIW,而不是 Integer,尝试对 Pascal 中的相关变量使用 Int64。
标签: python pascal factorization