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

来自CloudWiki
跳转至: 导航搜索
第47行: 第47行:
 
</nowiki>
 
</nowiki>
  
 +
==回文素数 ==
 +
 +
===描述===
 +
 +
回文素数是指一个数既是素数又是回文数。例如,131,既是素数又是回文数。
 +
用户输入一个正整数 n , 请你在一行内输出从小到大排列的的前n个回文素数,数字后面用一个空格进行分隔。‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬
 +
 +
===输入格式===
 +
 +
输入一个正整数‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬
 +
===输出格式===
 +
 +
符合要求的回文素数‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬
 +
 +
===输入输出示例===
 +
<nowiki>
 +
 +
 +
def is_prime(n):
 +
    """判断素数的函数,接收一个正整数为参数,参数是素数时返回True,否则返回False
 +
    减小判定区间,减少循环次数,提升效率。
 +
    """
 +
    if n < 2:
 +
        return False      # 0、1、负数以及偶数都不是素数
 +
    for i in range(2, int(n ** 0.5) + 1):
 +
        if n % i == 0:    # 能被2到其根号n之间的整数整除的数不是素数
 +
            return False
 +
    else:
 +
        return True      # for循环正常结束,未遇到return的数是素数
 +
 +
 +
def palindromic(num):
 +
    """接收一个数字为参数,判定其是否为回文数,返回布尔值。"""
 +
    if str(num) == str(num)[::-1]:
 +
        return True
 +
    else:
 +
        return False
 +
 +
 +
def output_prime(num):
 +
    """接收一个正整数num为参数,在一行中从小到大输出前num个回文素数。
 +
    函数无返回值
 +
    """
 +
    i = 2                      # 从最小的素数2开始测试
 +
    count = 0                  # 计数器置0
 +
    while True:                # 无限循环
 +
        if palindromic(i) and is_prime(i):  # 先判断回文再判断素数,效率高
 +
            print(i, end=' ')  # i为回文素数时输出i,输出后不换行
 +
            count = count + 1  # 每发现一个回文素数计数增加1
 +
        if count == num:      # 如果找到回文素数数量与要求数量相同时
 +
            break              # 结束循环
 +
        i = i + 1              # 测试下一个数字
 +
 +
 +
if __name__ == "__main__":
 +
    n = int(input())
 +
    output_prime(n)
 +
 +
</nowiki>
 
==计算ID号==
 
==计算ID号==
 
===描述===
 
===描述===

2021年11月12日 (五) 09:52的版本

二分法求平方根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()计算平方根


回文素数

描述

回文素数是指一个数既是素数又是回文数。例如,131,既是素数又是回文数。

用户输入一个正整数 n , 请你在一行内输出从小到大排列的的前n个回文素数,数字后面用一个空格进行分隔。‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬

输入格式

输入一个正整数‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬

输出格式

符合要求的回文素数‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬

输入输出示例



def is_prime(n):
    """判断素数的函数,接收一个正整数为参数,参数是素数时返回True,否则返回False
    减小判定区间,减少循环次数,提升效率。
    """
    if n < 2:
        return False      # 0、1、负数以及偶数都不是素数
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:    # 能被2到其根号n之间的整数整除的数不是素数
            return False
    else:
        return True       # for循环正常结束,未遇到return的数是素数


def palindromic(num):
    """接收一个数字为参数,判定其是否为回文数,返回布尔值。"""
    if str(num) == str(num)[::-1]:
        return True
    else:
        return False


def output_prime(num):
    """接收一个正整数num为参数,在一行中从小到大输出前num个回文素数。
    函数无返回值
    """
    i = 2                      # 从最小的素数2开始测试
    count = 0                  # 计数器置0
    while True:                # 无限循环
        if palindromic(i) and is_prime(i):  # 先判断回文再判断素数,效率高
            print(i, end=' ')  # i为回文素数时输出i,输出后不换行
            count = count + 1  # 每发现一个回文素数计数增加1
        if count == num:       # 如果找到回文素数数量与要求数量相同时
            break              # 结束循环
        i = i + 1              # 测试下一个数字


if __name__ == "__main__":
    n = int(input())
    output_prime(n)


计算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)