Advertisement
huyhung94

Nhân 2 số có dấu ( Booth)

Jan 16th, 2015
193
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.43 KB | None | 0 0
  1. import math
  2. def dec2bin(n):
  3.     k = []
  4.     while n<>0:
  5.         k.insert(0,int(math.fmod(n,2)))
  6.         n = int(n/2)
  7.     return k
  8.  
  9. def bin2dec(k):
  10.     result = 0
  11.     for i in range(len(k)):
  12.         result = result + k.pop() * pow(2,i)
  13.     return result
  14.  
  15. def add(a,b):
  16.     k = []
  17.     nho = 0
  18.     for i in range(len(a)):
  19.         tmp = a[len(a)-i-1] + b[len(b) - i - 1] + nho
  20.         k.insert(0,int(math.fmod(tmp,2)))
  21.         nho = tmp / 2
  22.     return k
  23.  
  24. def edit(a,b)
  25.     for i in range(len(a)):
  26.         if a[i] == 0:
  27.             a[i] = 1
  28.         else:
  29.             a[i] = 0
  30.     b[len(a)-1] = 1
  31.     return add(a,b)
  32.    
  33. def shr(a,q,q1):
  34.     a.insert(0,a[0])
  35.     q.insert(0,a.pop())
  36.     q1 = q.pop()
  37.     return a,q,q1
  38.    
  39. def main():
  40.     m, q, a, am_m = [], [], [], []
  41.     so1 = int(raw_input('Nhap so bi nhan = '))
  42.     so2 = int(raw_input('Nhap so nhan = '))
  43.    
  44.     #Chuyen sang so nhi phan   
  45.     m = dec2bin(math.fabs(so1))
  46.     q = dec2bin(math.fabs(so2))
  47.    
  48.     #Can bang so bit:
  49.     if len(m) > len(q):
  50.         for i in range(len(m) - len(q) +1 ):
  51.             q.insert(0,0)
  52.         m.insert(0,0)
  53.     elif len(m) < len(q):
  54.         for i in range(len(q) - len(m) +1 ):
  55.             m.insert(0,0)
  56.         q.insert(0,0)
  57.     else:
  58.         m.insert(0,0)
  59.         q.insert(0,0)
  60.    
  61.     #A <- 0
  62.     for i in range(len(m)):
  63.         a.insert(0,0)
  64.     n = len(m)
  65.     dem = n
  66.     #Hieu chinh thanh 2 so duong, tim -M
  67.     if so1 >=0 :
  68.         am_m = list(m)
  69.         am_m = edit(am_m,list(a))
  70.     else:
  71.         am_m = list(m)
  72.         m = edit(m,list(a))
  73.     if so2 < 0:
  74.         q = edit(q,list(a))
  75.     q1 = 0
  76.     #============================================#
  77.     print "*"*55
  78.     print "*"," "*51,"*"
  79.     print "*"," "*20,"AT9B - KMA"," "*19,"*"
  80.     print "*"," "*16,"Thuat toan Booth"," "*17,"*"
  81.     print "*"," "*51,"*"
  82.     print "*"*55
  83.     print "\nM = %s\t-M = %s\nQ = %s\n" % (m,am_m,q)
  84.     print "\n    A             Q      Q-1"
  85.     print "%s %s %s    n = %d" % (a,q,q1,n)
  86.     while True:
  87.         if(q[dem-1]==1) and (q1 == 0):
  88.             a = add(a,am_m)
  89.             raw_input()
  90.             print a,q,q1, "   A <- A - M"
  91.         elif (q[dem-1]==0) and (q1==1):
  92.             a = add(a,m)
  93.             raw_input()
  94.             print a,q,q1, "   A <- A + M"
  95.         raw_input
  96.         a,q,q1 = shr(a,q,q1)
  97.         print a, q, q1, "   Dich phai, n=",n-1
  98.         n = n - 1
  99.         if n == 0:
  100.             break      
  101.            
  102.     #Hieu chinh ket qua    
  103.     k = []
  104.     for i in range(len(a)):
  105.         k.append(a[i])
  106.     for i in range(len(q)):
  107.         k.append(q[i])     
  108.     if so1*so2 >0:
  109.         result = bin2dec(k)
  110.         print "====> %d * %d = %d" % (so1,so2,result)
  111.     else:
  112.         tmp = []
  113.         for i in range(2*len(a)):
  114.             tmp.append(0)
  115.         k = edit(k,tmp)
  116.         result = bin2dec(k)
  117.         print "====> %d * %d = -%d" % (so1,so2,result)
  118.     raw_input()
  119. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement