“Python题库:函数”的版本间的差异

来自CloudWiki
跳转至: 导航搜索
第46行: 第46行:
  
 
</nowiki>
 
</nowiki>
 +
 +
==计算ID号==
 +
===描述===
 +
 +
我的微信ID是大写字母WHUT后面的数字是两个素数连在一起,大的在前,小的在后,如果我告诉你两数的乘积是多少,你能计算出我的ID号吗?‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬
 +
 +
如果输入一个[0-9]之间的数字,你能统计出从1开始到我ID中的数字的序列里,一共出现多少次这个数字吗?‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬
 +
 +
===输入格式===
 +
 +
第一行输入ID中两个素数的乘积‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬
 +
 +
第二行输入一个[0-9]之间的数字‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬
 +
 +
===输出格式===
 +
 +
第一行输出ID号‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬
 +
 +
第二行输出数字的次数‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬
 +
 +
===输入输出示例===
 +
 +
<nowiki>
 +
输入 输出
 +
示例 1 196409
 +
3 WHUT997197
 +
599140</nowiki>
 +
 +
===代码===
 +
<nowiki>
 +
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)</nowiki>

2021年11月12日 (五) 07:33的版本

二分法求平方根B

描述

设计一个用二分法计算一个大于或等于 0 的实数 n 的平方根的函数sqrt_binary(n),实数 n和计算精度控制由用户在同一行内输入,用逗号进行分隔,输出结果保留8位小数。当(abs(x * x - n) )小于或等于设定的精度时,近似认为 x * x == n。‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬

注:初始区间取[0,n+0.25]‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬

输入格式

在同 行内输入一个实数 n(大于或等于0)和一个代表精度的数字(可用1e-m格式输入),逗号间隔‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬

输出格式

第一行输出用自己设计的函数计算得到的平方根‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬

第二行输出用math库开平方函数计算得到的平方根‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬

输入输出示例

输入 	输出

示例 1 5.0,1e-7

代码



import math


def sqrt_binary(num, accuracy):
	"""接收一个浮点数num和一个表示计算精度的浮点数accuracy为参数,用二分法计算浮点数的平方根x,
	当 abs(x * x - num) <= accuracy时认为达到计算精度,以浮点数类型返回计算得到的平方根。"""
	low, high = 0, num + 0.25             # 设定初始区间
	while True:                           # 构建无限循环
		x = (high + low) / 2              # 假设平方根落在区间的二分之一处,即中点
		if abs(x * x - num) <= accuracy:  # 当误差小于计算精度时,终止循环
			return x                      # 返回当前的x值为平方根
		elif x * x - num < 0:             # 当前x的平方小于num时,平方根应该位于右侧区间
			low = x                       # 以当前数值为区间下限,缩小区间为原来的一半
		else:                             # 当前x的平方大于num时,平方根应该位于左侧区间
			high = x                      # 以当前数值为区间上限,缩小区间为原来的一半


n, error = map(float, input().split(','))      # 输入浮点数 n 和计算精度
print('{:.8f}'.format(sqrt_binary(n, error)))  # 调用二分法函数计算平方根
print('{:.8f}'.format(math.sqrt(n)))           # 用math库中的sqrt()计算平方根


计算ID号

描述

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

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

输入格式

第一行输入ID中两个素数的乘积‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬

第二行输入一个[0-9]之间的数字‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬

输出格式

第一行输出ID号‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬

第二行输出数字的次数‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬

输入输出示例

输入 	输出
示例 1 	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)