Advertisement
Guest User

Untitled

a guest
Oct 24th, 2015
316
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.04 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # -*- coding: UTF-8 -*-
  3. import timeit
  4.  
  5.  
  6. import math
  7.  
  8. a = 2794
  9. b = 6083
  10. k = 23
  11.  
  12. def lengthPeriod(x, y):
  13.     if y == 1:
  14.         return 0
  15.     else:
  16.         r = x
  17.         for i in range(int(math.log(y)/math.log(2))):
  18.             r = 10 * r % y
  19.         q = r
  20.         r = 10 * r % y
  21.         l = 1;
  22.         while r != q:
  23.             r = 10 * r % y
  24.             l += 1
  25.         return l
  26.  
  27. def lengthPrePeriod(y):
  28.     r = y % 2
  29.     l = 0
  30.     while r == 0:
  31.         y = y // 2
  32.         r = y % 2
  33.         l += 1
  34.     r = y % 5
  35.     l1 = 0
  36.     while r == 0:
  37.         y = y // 5
  38.         r = y % 5
  39.         l1 += 1
  40.     return max(l, l1)
  41.  
  42. def findFrackPart(x, y, lpp, lp):
  43.     i = 0
  44.     frackPart = "0."
  45.     while i in range(lpp + lp):
  46.         frackPart += str(10 * x // y)
  47.         x = 10 * x % y
  48.         i += 1
  49.     return frackPart
  50.  
  51. def convertIntK(x, p):
  52.     s = ""
  53.     gotcha = True
  54.     while gotcha:
  55.         n = x % p
  56.         if n >= 10:
  57.             s += chr(87 + n)
  58.         else:
  59.             s += str(n)
  60.         x = x // p
  61.         if x == 0:
  62.             gotcha = False
  63.     s = s[::-1]
  64.     return s
  65.  
  66. def convertFracK(x, p, lpp, lp):
  67.     quantcha = 0
  68.     flag = False
  69.     s = "."
  70.     while quantcha in range(lpp + lp):
  71.         if x == 0:
  72.             break
  73.         if quantcha == lpp:
  74.             s += "("
  75.             flag = True
  76.         m = math.modf(x * p)
  77.         if int(m[1]) >= 10:
  78.             s += chr(87 + int(m[1]))
  79.         else:
  80.             s += str(int(m[1]))
  81.         x = m[0]
  82.         quantcha += 1
  83.     if flag:
  84.         s += ")"
  85.     return s
  86.  
  87. def divK(x, y, p):
  88.     lp = lengthPeriod(x, y)
  89.     lpp = lengthPrePeriod(y)
  90.     answ = convertIntK(x // y, p)
  91.     if x % y != 0:
  92.         answ += convertFracK(float(findFrackPart(x % y, y, lpp, lp)), p, lpp, lp)
  93.     return answ
  94.  
  95. try:
  96.     print divK(a, b, k)
  97. except ValueError:
  98.     print "Введенное число некорректно!"
  99.  
  100. print timeit.timeit('divK(a, b, k)', number=10000, setup="from __main__ import divK, a, b, k")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement