题目链接
简单兔子
题目如下:
有一只兔子,从出生后第2个月起每个月都生只兔子,小兔子长到第2个月后每个月又生一只兔子,假如兔子都不死,问每个月的兔子总数为多少?
对于这道问题,可以自己模拟6个月或其他月份来解决。
我们从图中可以发现,当前月的兔子数目等于上个月的兔子数目,加上上个月的兔子数目,因为他们会生小兔子。所以就是斐波那契数列。
递推代码如下:
m = int(input())
a,b = 1,1
if m == 1 or m==2:
print(a)
else:
for i in range(m-2):
a,b = b,a+b
print(b)
递归代码如下:
def f(n):
if n == 1 or n==2:
return 1
return f(n-1)+f(n-2)
n = int(input())
print(f(n))
记忆化思想递归代码如下:
def f(n):
if q[n] != -1:
return q[n]
t = f(n-1)+f(n-2)
q[n] = t
return t
n = int(input())
q = [-1]*(n+1)
q[1],q[2]=1,1
print(f(n))
分解质因子
首先求质因子,C++方法如下:
# include<iostream>
using namespace std;
bool first = true;
void zyz(int n, int p){
if(n>1){
if(n%p==0){
if(first){
cout<<p;
first=false;
}
else cout<<" "<<p;
zyz(n/p,p);
}
else zyz(n,p+1);
}
}
int main(){
int n;
cin>>n;
zyz(n,2);
cout<<endl;
}
参照C++,可写python如下:
def f(n,p):
if n>1:
if n%p == 0:
res.append(p)
f(n//p,p)
else:
f(n,p+1)
n = int(input())
res = []
f(n,2)
print(res)
上面代码求解小数的质因子是可以的,但是不知道为何求大数就不行了?希望看到的家人们可以为我解答一下。
上面那道题的代码如下,没有用递归
from math import sqrt
n = int(input())
print(f'{n}=',end='')
f = False
for v in range(2,int(sqrt(n))+1):
c = 0
while n%v == 0:
c += 1
n //=v
if c>1 and not f:
print(f'{v}^{c}',end='')
f = True
elif c==1 and not f:
print(f'{v}',end='')
f = True
elif c>1 and f:
print(f'*{v}^{c}',end='')
elif c==1 and f:
print(f'*{v}',end='')
if n>1 and f:
print(f'*{n}',end='')
elif n>=1 and not f:
print(f'{n}',end='')
八进制
不用递归的简单python代码如下:
while 1:
try:
n = int(input())
except:
break
print(oct(n)[2:])
用递归代码如下:
def f(n):
if n<8:
return n
return f(n//8)*10+n%8
while 1:
try:
n = int(input())
print(f(n))
except:
break
爬楼梯游戏
主要思想:递归,最后一步是1级还是2级。
由于题目数据量到10的18,不能用递归
def f(n):
if n==1:
return 1
elif n==2:
return 2
return f(n-1)+f(n-2)
n = int(input())
print(f(n))
递归方法2:
def dsf(s):
global ans
if s > n:
return
if s == n:
ans += 1
dsf(s+1)
dsf(s+2)
n = int(input())
ans = 0
dsf(0)
print(ans)
可以用矩阵幂解决
def multi(matrix_a,matrix_b,MOD):
matrix_result = [[0 for _ in range(len(matrix_b[0]))] for _ in range(len(matrix_a))]
for i in range(len(matrix_a)):
for j in range(len(matrix_b[0])):
for k in range(len(matrix_b)):
matrix_result[i][j] += (matrix_a[i][k]*matrix_b[k][j]) % MOD
return matrix_result
def quick_multi(matrix,m,MOD):
res = [[1, 0], [0, 1]]
while m:
if m & 1:
res = multi(res, matrix, MOD)
matrix = multi(matrix, matrix, MOD)
m = m>>1
return res
MOD = 1000000007
N = int(input())
if N < 3:
print([0, 1, 2][N])
else:
M12 = [[1,2]]
matrix = [[0, 1], [1, 1]]
res = multi(M12, quick_multi(matrix, N-2, MOD), MOD)
print(res[0][-1] % MOD)