华为机试(python):基础数学

这篇博客涵盖了多个算法的实现,包括求最小公倍数、浮点数取整、IP地址与整数的转换、杨辉三角的变形和寻找与7相关的数字。同时也探讨了完全数的计算,展示了如何找出一定范围内完全数的个数。文章通过代码实例展示了算法的运用和数学规律的发现。
摘要由CSDN通过智能技术生成

HJ108 求最小公倍数

题目:

正整数A和正整数B 的最小公倍数是指 能被A和B整除的最小的正整数值,设计一个算法,求输入A和B的最小公倍数。

输入描述:

输入两个正整数A和B。

输出描述:

输出A和B的最小公倍数。

##短除法
A,B = map(int,input().split())
T = 1
for i in range(2,min(A,B)+1):
    while A % i == 0 and B % i == 0:
        #T为最小公约数
        T = T * i
        #//向下取整
        A = A//i
        B = B//i
print(T*B*A)

HJ7 取近似值

写出一个程序,接受一个正浮点数值,输出该数值的近似整数值。如果小数点后数值大于等于 0.5 ,向上取整;小于 0.5 ,则向下取整。

输入描述:

输入一个正浮点数值

输出描述:

输出该数值的近似整数值

while True:
    try:
        
        a = float(input())
        
        if a-int(a) == 0.5:
            print(int(a)+1)
        else:
            print(int(round(a,0)))
                
    except:
        break
        

HJ33 整数与IP地址间的转换

原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成
一个长整数。
举例:一个ip地址为10.0.3.193
每段数字             相对应的二进制数
10                   00001010
0                    00000000
3                    00000011
193                  11000001

组合起来即为:00001010 00000000 00000011 11000001,转换为10进制数就是:167773121,即该IP地址转换后的数字就是它了。

输入描述:

输入 
1 输入IP地址
2 输入10进制型的IP地址

输出描述:

输出
1 输出转换成10进制的IP地址
2 输出转换后的IP地址

# import re




# def ten_two(s):
#     e = [0,0,0,0,0,0,0,0]
#     for i in range(0,8,1):
#         e[i] = int(s%2)
#         s=s//2
#     e.reverse()
#     return e
# while True:
#     try:
#         IP = input()
#         Ten = input()
#         IP_list = IP.split('.')
#         Two_list = []
#         for i in IP_list :
#             Two_list.append(ten_two(int(i)))
#         two = []
#         for j in Two_list:
#             two.append(str(j).replace(',','').replace('[','').replace(']',''))
#         for m in range(len(two)):
#             two[m] = ''.join(two[m])
#         #print(two)
#         all = str(two).replace('[','').replace(']','').replace(',','').replace("'",'').strip()
#         #print(int(all,2))
#         all_two = 
#         print(all_two)
        
        
        
        
        
#     except:
#         break
        
while True:
    try:
        ip = input()
        num = input()
    except:
        break
    else:
        # ip to num
        ip_list = ip.split('.')
        ip2num = str()
        for i in ip_list:
            a = bin(int(i,10))[2:]
            #高位补零
            a = '0'*(8-len(a)) + a if len(a)<8 else a
            #字符串相加不会产生一些空格
            ip2num += a
        #二进制转十进制
        print(int(ip2num,2))
        # num to ip
        num2ip = []
        num2 = bin(int(num,10))[2:]
        #高位补零
        num2 = '0'*(32-len(num2)) + num2 if len(num2)<32 else num2
        for i in range(4):
            #每八位取一个二进制数
            b = num2[8*i:8*i+8]
            b = str(int(b,2))
            num2ip.append(b)
        print('.'.join(num2ip))
    

        





HJ53 杨辉三角的变形

以上三角形的数阵,第一行只有一个数1,以下每行的每个数,是恰好是它上面的数、左上角数和右上角的数,3个数之和(如果不存在某个数,认为该数就是0)。

求第n行第一个偶数出现的位置。如果没有偶数,则输出-1。例如输入3,则输出2,输入4则输出3,输入2则输出-1。

while True:
    try:
        #找规律
        #前两行没有偶数,从第三行开始,第一个偶数出现的位置2324循环
        n = int(input())
        a = [2,3,2,4]
        if n<=2:
            print(-1)
        else:
            print(a[(n-3)%4])
              
    except:
        break

会超时 

# //杨辉三角规律                                    行号    第一个偶数在该行第几个
# //                    1                           1             -1
# //                1   1   1                       2             -1
# //            1   2   3   2   1                   3              2
# //         1  3   6   7   6   3   1               4              3
# //      1  4  10  16  19  16  10  4  1            5              2
# //   1  5  15 30  45  51  45  30  15 5  1         6              4
# //
# //  首个偶数在该行第几个的规律: -1 -1 (2 3 2 4)···(2 3 2 4)
#穷举出所求行的数字,判断所求行偶数的位置
while True:
    try:
        n = int(input())
        if n<3:
            print(-1)
        else:

            arr = [[] for i in range(n)]
            arr[0] = [1]
            arr[1] = [1,1,1]

            m = 2
            while m < n :
                column_num = 2*m + 1
                for i in range(column_num):
        #             print(i)
        #             print(arr[m-1][i-2 if i-2 >=0 else 0:i+1])
                    arr[m].append(sum(arr[m-1][i-2 if i-2 >=0 else 0:i+1]))
                m = m+1
            def cal(n,arr):
                for i,j in enumerate(arr[n-1]):
                    if j%2 == 0:
                        return i+1
                return -1
            index = cal(n,arr)
            print(index)
    except:
        break

HJ55 挑7

输出 1到n之间 的与 7 有关数字的个数。

一个数与7有关是指这个数是 7 的倍数,或者是包含 7 的数字(如 17 ,27 ,37 ... 70 ,71 ,72 ,73...)

输入描述:

一个正整数 n 。( n 不大于 30000 )

输出描述:

一个整数,表示1到n之间的与7有关的数字个数。

while True:
    try:
        
        n = int(input())
        res = []
        for i in range(1,n+1):
            if i%7==0 :
                res.append(i)
            elif '7' in str(i):
                res.append(i)
        print(len(list(set(res))))
                
                
            
        
        
        
        
    except:
        break
        

HJ56 完全数计算

完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。

它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。

例如:28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28。

输入n,请输出n以内(含n)完全数的个数。

输入描述:

输入一个数字n

输出描述:

输出不超过n的完全数的个数

要注意刷新的位置。

while True:
    try:
        
        n = int(input())
        p = []
        for j in range(1,n):
            q = 0
            for i in range(1,j):
                if j%i == 0:
                    q += i
            if q == j:
                p.append(j)
        print(len(p))
        
 
        
        
    except:
        break
        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值