python123题目——计算ID号

计算ID号

类型:函数

描述

我的微信ID是大写字母WHUT后面的数字是两个素数连在一起,大的在前,小的在后,如果我告诉你两数的乘积是多少,你能计算出我的ID号吗?

如果输入一个[0-9]之间的数字,你能统计出从1开始到我ID中的数字的序列里,一共出现多少次这个数字吗?

输入格式

第一行输入ID中两个素数的乘积

第二行输入一个[0-9]之间的数字

输出格式

第一行输出ID号

第二行输出数字的次数

输入输出示例

示例

输入:
196409
3      
输出:
WHUT997197
599140

参考答案

def isPrime(n):  # 判断参数 n 是否为素数的函数
    if n < 2:  # 小于2的数字都不是素数
        return False
    for i in range(2, int(n ** 0.5) + 1):  # 根据素数定义判定是否是素数,是素数返回1
        if n % i == 0:  # 从 2到n-1中如果存在一个数是i,使n 可以整除i,则n不是素数
            return False
    else:  # 若for循环未遇到return正常结束,则n是素数
        return True


def checkId(n):
         if n % 2 == 0 and isPrime(n // 2):      #  如果n能被2整除,单独处理,提高效率
                   return int(str(n // 2) + str(2))
         else:
                   for num in range(3,n//2+1,2):       #  如果n不能被2整除,则两个素数不包括2,都是奇数
                            if isPrime(num) and n % num == 0 and isPrime(n // num):  # isPrime(n // num)放在最后,利用短路效应,可以使大数的素数判定次数最少
                                     return int(str(n // num) + str(num))   # 返回值转字符串拼接后再转整数

def countnumber(n,num):
    m, countnum = 1, 0
    while n//m > 0:
        high, mod = divmod(n, m*10)
        curNum, low = divmod(mod, m)
        if curNum > num:
            countnum += high*m + m
        elif curNum == num:
            countnum += high*m + low + 1
        else:
            countnum+= high*m
        m = m*10
    return countnum


if __name__ == '__main__':
         n = int(input())                        # 输入ID,整数,保证是两个素数的积
         number = int(input())                  # 输入0-9之间的一个数字
         ID = checkId(n)
         countNumber = countnumber(ID,number)    # 统计 number的个数
         print('WHUT' + str(ID))
         print(countNumber)

# def occ3(n,num):
#     s = 0
#     for i in range(len(str(n))):
#         x = int(str(n)[-i-1])
#         s += n//10**(i+1)*10**i
#         if x == num:
#             s += n%10**i+1
#         if x > num:
#             s += 10**i
#     return s

        
# def isPrime(n):          #判断素数的函数
#     if n < 2 or n % 2==0:
#         return False     #0、1、负数以及偶数都不是素数
#     for i in range(3, int(n**0.5)+1,2):
#         if n % i == 0:    #能被2到其自身减1的数整除的数不是素数
#             return False
#     else:
#         return True      #for循环正常结束,未遇到return的数是素数

# n = int(input())      #接收用户输入并转成整数707829217
# number = int(input())
# for i in range(n):
#     if isPrime(i) and n%i==0 and isPrime(n//i):  #判断i和N-i是否同时是素数,同时保证两个数加和为N
#         print("WHUT{}{}".format(n//i,i))
#         break       #找到一个符合条件的数就结束循环
# m = int(str(n//i)+str(i))
# print(occ3(m,number))
# print(three(m,number))
# m = int(str(n//i)+str(i))

# num=0
# for j in range(1,m+1):
#     if number in str(j):
#              num=num+str(j).count(number)
# print(num)
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m0_62488776

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值