1.A+B問題
解法一:直接return a+b
解法二:通過位運算計算A+B
def add(a, b):
if a==0:
return b
if b==0:
return a
else:
sum=a^b
j=(a&b)<<1
return add(sum, j)
①忽略進位計算a+b 只有0,1或1,0時才爲1 sum爲計算兩數的二進制異或結果
②計算進位結果 只有兩個1時才進位 j爲計算兩數的二進制與結果
③將前兩步結果相加,相加方式仍使用上述方法,直至有一個數字爲0,返回另一個
2.尾部的零
設計一個算法,計算出n階乘中尾部零的個數
方法1: ①首先計算一個數字的階乘,得到結果。
②設計一個整除循壞(如下面while所示)假如數字不可以整除10,即尾部沒有0 跳出循壞,假如可以整除10,則進入循環依次看是否可以整除100,1000… 整除位數每多一位,i+1
此方法算法複雜度較高,不能通過測試
#定義一個計算階乘的函數(遞歸求階乘):
def jie(n):
if n == 1:
return 1
else:
return n * jie(n - 1)
#定義一個計算階乘的函數(循環求階乘):
def jie(n):
sum=1
for i in range(1,n+1):
sum =sum*i
return sum
n = int(input("input"))
sum =jie(n)
i = 0 #初始化個數0
t = 10
while sum % t == 0:
i = i + 1
t = t * 10
print(i)
方法2:數字的階乘可以寫成一系列因子的乘積,尾部是0即因子2*5,故可直接數 這些因子中有多少個5
例如25的階乘:因子有 1*5 2*5 3*5 4*5 5*5 ,因子5共出現6次。
數量即爲: n/5+n/5/5+…n/5/5…/5
def function(n):
sum=0
while (n/5):
sum=sum+int(n/5)
n=n/5
return sum
37.反轉一個3位整數
反轉一個只有3位數的整數
解法:分別求出這個三位數的百位,十位,個位數字,再分別乘以不同位置的權重。
def function(number):
x = int(number/100)
y = int(number/10%10)
z = int(number%10)
return z*100+y*10+x
145.大小寫轉換
將一個字符由小寫字母轉換爲大寫字母
解法:字符都有對用的ASCII碼值。先判斷字符是大寫還是小寫字母,若是小寫字母,則將其ASCII碼值減去32,再重新轉換爲字符。反之加上32亦然。
def function(character):
if 'a'<=character<='z':
return chr(ord(character)-32)
if 'A'<=character<='Z':
return chr(ord(character)+32)
454.矩陣面積
實現一個矩陣類Rectangle,包含如下的一些成員變量與函數:
1.兩個共有的成員變量 width 和 height 分別代表寬度和高度。
2.一個構造函數,接受2個參數 width 和 height 來設定矩陣的寬度和高度。
3.一個成員函數 getArea,返回這個矩陣的面積。
class Rectangle(object):
width = 0
height = 0
def __init__(self, width, height):
self.width = width
self.height = height
def getArea(self):
return self.width*self.height