Python基础算法训练——函数与递归(46~50)

46. 数字统计
【题目描述】
请统计某个给定范围 [L,R] 的所有整数中,数字 7 出现的次数。
比如给定范围 [60,80] 中,7一共出现12次。分别是67,77的个位,以及 70∼79 的十位。
【输入】
一行两个数 L,R 表示范围,用空格分隔。
【输出】
一个整数表示数字 7 出现的次数。
【输入样例】
60 80
【输出样例】
12

l,r=map(int,input().split())
ans=0
for i in range(l,r+1):
    t=i
    while t:
        if t%10==7:
            ans+=1
        t//=10
print(ans)

47. 哥德巴赫猜想
【题目描述】
哥德巴赫猜想是近代三大数学难题之一,即任何一个大于2的偶数,都可表示成两个素数之和。如4=2+2,6=3+3,8=3+5,10=3+7。
请定义一个判断素数的函数,利用它验证4∼n之间的偶数都能够分解为两个素数之和,其中n≥4 。
【输入】
一行一个整数,为n。
【输出】
输出若干行,每行输出一个等式,表示4∼n之间的偶数被分解为两个素数之和,若偶数不符合该整式,则输出“验证失败!”。
【输入样例】
10
【输出样例】
4=2+2
6=3+3
8=3+5
10=3+7

import math
def is_prim(n):
    if n<2:
        return False
    for i in range(2,int(math.sqrt(n))+1):
        if n%i==0:
            return False
    return True
n=int(input())
for i in range(4,n+1,2):
    for j in range(2,i//2+1):
        if is_prim(j) and is_prim(i-j):
            print("{}={}+{}".format(i,j,i-j))
            break

48. 第N个智慧数
【题目描述】
一个正整数如果能表示成两个正整数的平方差,则称这个数为一个“智慧数”,比如16就等于5的平方减去3的平方,所以16就是一个智慧数,从1开始的自然数列中,将“智慧数"从小到大编号为1,2,3,...,n。现输入一个正整数n,输出第n个“智慧数”。
【输入】
输入仅包含一个正整数n (1≤n≤100)。
【输出】
输出仅包含一个正整数,表示编号为n的“智慧数”。
【输入样例】
3
【输出样例】
7

ls=[0]*100000
k=0
for i in range(2,251):
    for j in range(i-1,0,-1):
        ls[k]=i*i-j*j
        k+=1
ls_=sorted(list(set(ls[:k])))
#print(k,ls_)
n=int(input())
print(ls_[n-1])

49. 通力合作
【题目描述】
利用递归算法,试编一程序,输出1∼100的自然数。
【输入】

【输出】
一行若干个整数,为1∼100的自然数,每个整数占5个字符(右对齐)。
【输入样例】

【输出样例】
1    2    3    4    5    6    7    8    9   10   11   12   13   14   15   16   17   18   19   20   21   22   23   24   25   26   27   28   29   30   31   32   33   34   35   36   37   38   39   40   41   42   43   44   45   46   47   48   49   50   51   52   53   54   55   56   57   58   59   60   61   62   63   64   65   66   67   68   69   70   71   72   73   74   75   76   77   78   79   80   81   82   83   84   85   86   87   88   89   90   91   92   93   94   95   96   97   98   99  100

def f(x):
    if x==0:
        return
    f(x-1)
    print("%5d"%x,end="")
f(100)

50. 转进制
【题目描述】
用递归算法将一个十进制数X转换成任意进制数M(M≤16)。
【输入】
一行两个数,第一个十进制数X,第二个为进制M。
【输出】
输出结果。
【输入样例】
31 16
【输出样例】
1F

def ten_to_m(x,m):
    if x==0:
        return 
    ten_to_m(x//m, m)
    if x%m>9:
        print(chr(x%m-10+ord('A')),end='')
    else :
        print(x%m,end="")

x,m=map(int,input().split())
ten_to_m(x,m)