基本数字运算
一.如何判断一个自然数是否是某个数的平方
def isPower ( n) :
if n<= 0 :
print ( n+ "不是自然数" )
return False
i= 1
while i< n:
m= i* i
if m== n:
return True
elif m> n:
return False
i+= 1
return False
if __name__== "__main__" :
n1= 15
n2= 16
if isPower( n1) :
print ( str ( n1) + "是某个自然数的平方" )
else :
print ( str ( n1) + "不是某个自然数的平方" )
if isPower( n2) :
print ( str ( n2) + "是某个自然数的平方" )
else :
print ( str ( n2) + "不是某个自然数的平方" )
15不是某个自然数的平方
16是某个自然数的平方
2.二分查找法
def isPower ( n) :
low= 1
high= n
while low< high:
mid= int ( ( low+ high) / 2 )
power= mid* mid
if power> n:
high= mid- 1
elif power< n:
low= mid+ 1
else :
return True
return False
if __name__== "__main__" :
n1= 15
n2= 16
if isPower( n1) :
print ( str ( n1) + "是某个自然数的平方" )
else :
print ( str ( n1) + "不是某个自然数的平方" )
if isPower( n2) :
print ( str ( n2) + "是某个自然数的平方" )
else :
print ( str ( n2) + "不是某个自然数的平方" )
15不是某个自然数的平方
16是某个自然数的平方
3.减法运算法
def isPower ( n) :
minus= 1
while n> 0 :
n= n- minus
if n== 0 :
return True
elif n< 0 :
return False
else :
minus+= 2
return False
if __name__== "__main__" :
n1= 15
n2= 16
if isPower( n1) :
print ( str ( n1) + "是某个自然数的平方" )
else :
print ( str ( n1) + "不是某个自然数的平方" )
if isPower( n2) :
print ( str ( n2) + "是某个自然数的平方" )
else :
print ( str ( n2) + "不是某个自然数的平方" )
15不是某个自然数的平方
16是某个自然数的平方
二.如何判断一个数是否为2的n次方
1.构造法
def isPower ( n) :
if n< 1 :
return False
i= 1
while i<= n:
if i== n:
return True
i<< = 1
return False
if __name__== "__main__" :
n1= 8
n2= 9
if isPower( n1) :
print ( str ( n1) + "能表示成2的n次方" )
else :
print ( str ( n1) + "不能表示成2的n次方" )
if isPower( n2) :
print ( str ( n2) + "能表示成2的n次方" )
else :
print ( str ( n2) + "不能表示成2的n次方" )
8能表示成2的n次方
9不能表示成2的n次方
2.与操作法
def isPower ( n) :
if n< 1 :
return False
m= n& ( n- 1 )
return m== 0
if __name__== "__main__" :
n1= 8
n2= 9
if isPower( n1) :
print ( str ( n1) + "能表示成2的n次方" )
else :
print ( str ( n1) + "不能表示成2的n次方" )
if isPower( n2) :
print ( str ( n2) + "能表示成2的n次方" )
else :
print ( str ( n2) + "不能表示成2的n次方" )
8能表示成2的n次方
9不能表示成2的n次方
三.如何不使用除法操作实现两个正整数的除法
1.减法
def Divide ( m, n) :
print ( str ( m) + " 除以 " + str ( n) )
res= 0
remain= m
while m> n:
m-= n
res+= 1
remain= m
print ( "商为:" + str ( res) + " 余数:" + str ( remain) )
if __name__== "__main__" :
m= 14
n= 4
Divide( m, n)
14 除以 4
商为:3 余数:2
2.移位法
五.如何根据已知随机数生成函数计算新的随机数
import random
def Rand7 ( ) :
return int ( random. uniform( 1 , 7 ) )
def Rand10 ( ) :
x= 0
while True :
x= ( Rand7( ) - 1 ) * 7 + Rand7( )
if x<= 40 :
break
return x% 10 + 1
if __name__== "__main__" :
i= 0
while i!= 10 :
print ( Rand10( ) , end= " " )
i+= 1
1 9 6 5 1 3 6 2 6 9
六.如何判断1024!末尾有多少个0
1.蛮力法
2.因子法
def ZeroCount ( n) :
count= 0
while n> 0 :
n= int ( n/ 5 )
count+= n
return count
if __name__== "__main__" :
print ( "1024!末尾0的个数为:" + str ( ZeroCount( 1024 ) ) )
1024!末尾0的个数为:253
七.如何按要求比较两个数的大小
def Maxs ( a, b) :
return int ( ( ( a+ b) + abs ( a- b) ) / 2 )
if __name__== "__main__" :
print ( Maxs( 5 , 6 ) )
6
八.如何求有序数列的第1500个数的值
1.蛮力法
def Search ( n) :
count= 0
i= 1
while True :
if i% 2 == 0 or i% 3 == 0 or i% 5 == 0 :
count+= 1
if count== n:
break
i+= 1
return i
if __name__== "__main__" :
print ( Search( 1500 ) )
2045
2.数字规律法
def Search ( n) :
a= [ 0 , 2 , 3 , 4 , 5 , 6 , 8 , 9 , 10 , 12 , 14 , 15 , 16 , 18 , 20 , 21 , 22 , 24 , 25 , 26 , 27 , 28 , 30 ]
ret= int ( ( n/ 22 ) ) * 30 + a[ n% 22 ]
return ret
if __name__== "__main__" :
print ( Search( 1500 ) )
2045
九.如何把十进制数(long 型)分别以二进制和十六进制形式输出
def InttoBinary ( n) :
hexNum= 8 * 8
bit= [ ]
for i in range ( hexNum) :
b= n>> i
c, d= divmod ( b, 2 )
bit. append( str ( d) )
return "" . join( bit[ : : - 1 ] )
def InttoHex ( s) :
hexs= ""
remainder= 0
while s!= 0 :
remainder= s% 16
if remainder< 10 :
hexs= str ( remainder+ int ( '0' ) ) + hexs
else :
hexs= str ( remainder- 10 + ord ( 'A' ) ) + hexs
s= s>> 4
return chr ( int ( hexs) )
if __name__== "__main__" :
print ( "10的二进制输出为:" + InttoBinary( 10 ) )
print ( "10的十六进制输出为:" + InttoHex( 10 ) )
10的二进制输出为:0000000000000000000000000000000000000000000000000000000000001010
10的十六进制输出为:A
十.如何求二进制数中1的个数
1.移位法
def CountOne ( n) :
count= 0
while n> 0 :
if ( n& 1 ) == 1 :
count+= 1
n>> = 1
return count
if __name__== "__main__" :
print ( CountOne( 7 ) )
print ( CountOne( 8 ) )
3
1
2.与操作法
def CountOne ( n) :
count= 0
while n> 0 :
if n!= 0 :
n= n& ( n- 1 )
count+= 1
return count
if __name__== "__main__" :
print ( CountOne( 7 ) )
print ( CountOne( 8 ) )
3
1
十一.如何找最小的不重复数
十二.如何计算一个数的n次方
1.蛮力法
def Power ( d, n) :
if n== 0 :
return 1
if n== 1 :
return d
result= 1
if n> 0 :
i= 1
while i<= n:
result*= d
i+= 1
return result
else :
i= 1
while i<= abs ( n) :
result= result/ d
i+= 1
return result
if __name__== "__main__" :
print ( Power( 2 , 3 ) )
print ( Power( - 2 , 3 ) )
print ( Power( 2 , - 3 ) )
8
-8
0.125
2.递归法
def Power ( d, n) :
if n== 0 :
return 1
if n== 1 :
return d
tmp= Power( d, int ( abs ( n) / 2 ) )
if n> 0 :
if n% 2 == 1 :
return tmp* tmp* d
else :
return tmp* tmp
else :
if n% 2 == 1 :
return 1 / ( tmp* tmp* d)
else :
return 1 / ( tmp* tmp)
if __name__== "__main__" :
print ( Power( 2 , 3 ) )
print ( Power( - 2 , 3 ) )
print ( Power( 2 , - 3 ) )
8
-8
0.125
十三.如何在不能使用库函数的条件下计算n的平方根
def SquareRoot ( n, e) :
new_one= n
last_one= 1.0
while new_one- last_one> e:
new_one= ( new_one+ last_one) / 2
last_one= n/ new_one
return new_one
if __name__== "__main__" :
n= 50
e= 0.000001
print ( str ( n) + "的平方根%.6f " % SquareRoot( n, e) )
n= 4
print ( str ( n) + "的平方根%.6f " % SquareRoot( n, e) )
50的平方根7.071068
4的平方根2.000000
十四.如何不使用^操作实现异或运算
class MyXor :
def __init__ ( self) :
self. BITS= 32
def xor ( self, x, y) :
res= 0
i= self. BITS- 1
while i>= 0 :
b1= ( x& ( 1 << i) ) > 0
b2= ( y& ( 1 << i) ) > 0
if b1== b2:
xoreBit= 0
else :
xoreBit= 1
res<< = 1
res| = xoreBit
i-= 1
return res
if __name__== "__main__" :
x= 3
y= 5
mx= MyXor( )
print ( mx. xor( x, y) )
6
def Xor ( x, y) :
return ( x| y) & ( ~ x| ~ y)
if __name__== "__main__" :
x= 3
y= 5
print ( Xor( x, y) )
6
十五.如何不使用循环输出1到100