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