自动程序的长时间运行

时间:2017-11-07 20:47:29

标签: python algorithm math time-complexity

我编写了一个程序来解决n th 自守数(当平方时,数字以原始数字结束(例如625 2 = 390625,390625 %1000 = 625)。

import time
def green(n):
  start_time = time.time()
  f = 3
  if n==1:
    return 1
  elif n==2:
    return 5
  elif n==3:
    return 6
  n1 = "5"
  n2 = "6"
  tempn2 = "0"
  tempn1 = "0"
  x = 1
  while f!=n+1:
    if int(n1) > int(n2):
      tempn2 = str(x) + n2
      while int(pow(int(tempn2), 2, 10**(len(tempn2)))) != int(tempn2):
        tempn2 = str(x) + n2
        x+=1
      x=1
      f+=1
      n2 = tempn2
      if f==n+1:
        break
    else:
      tempn1 = str(x) + n1
      while int(pow(int(tempn1), 2, 10**len(tempn1))) != int(tempn1):
        tempn1 = str(x) + n1
        x+=1
      x=1
      f+=1
      n1 = tempn1
  print("--- %s seconds ---" % (time.time() - start_time))
  return min(int(n1), int(n2))

对于糟糕的代码感到抱歉,第一年Comp Sci。

Program Runtime vs. Input

我需要5000 th 输入小于12秒的运行时间。当前代码大约需要45秒。

2 个答案:

答案 0 :(得分:0)

  • 使用有意义的变量名称;字母汤很难读。
  • 用整数进行数学计算,而不是转换为字符串。由于您以1位数开头,因此知道字符串长度;保持10的正确功率。而不是字符串连接和转换为整数,只需直接编号。

代码

for f in range(1, n//2):
  ten_power = next_power    # Keep track of length in digits
  next_power *= 10

  # "old5" is the previous automorphic number ending in 5
  for digit in range(9, 0, -1):
      new5 = old5 + digit * ten_power
      new5sq = new5*new5
      if new5sq % next_power == new5:
          # you found the number
          old5 = new5
          break

您可以将这些内容用于现有代码吗?请注意,外部for循环具有不同的控件;找到两个 n//2次的5和6号码。你唯一关心较小的一个是在奇数n的最后一次迭代。

这在1.5秒内找到green(5000)

答案 1 :(得分:0)

只需几微秒的时间 代码

n=int(input('Enter any no.'))
temp=n
div=1
while temp>=1:
    temp=temp//10
    div=div*10
x=n**2
y=x%div
if n==y:
    print(' Automorphic')
else:
    print(' Not Automorphic')

甜美简单!