'commit'
This commit is contained in:
92
TangDou/LuoGuBook/7_7.cpp
Normal file
92
TangDou/LuoGuBook/7_7.cpp
Normal file
@@ -0,0 +1,92 @@
|
||||
#include <bits/stdc++.h>
|
||||
|
||||
using namespace std;
|
||||
typedef long long LL;
|
||||
|
||||
//是否已经出现过非零数字
|
||||
bool flag = false;
|
||||
|
||||
//数位分离递归版本[朴素版本]
|
||||
void inv0(int n) {
|
||||
//递归出口为当前数字n=0
|
||||
if (n == 0) {
|
||||
printf("\n");
|
||||
return;
|
||||
}
|
||||
//当前位数字
|
||||
int m = n % 10;
|
||||
printf("%d", m);
|
||||
//递归
|
||||
inv0(n / 10);
|
||||
}
|
||||
|
||||
//数位分离递归版本[朴素版本+标志优化]
|
||||
void inv1(int n) {
|
||||
//递归出口为当前数字n=0
|
||||
if (n == 0) {
|
||||
printf("\n");
|
||||
return;
|
||||
}
|
||||
//当前位数字
|
||||
int m = n % 10;
|
||||
if (!flag && !m) {//没有出现过非零数字,并且,当前的数字还是0,也是不输出的
|
||||
|
||||
} else {//其它情况都应该输出
|
||||
printf("%d", m);
|
||||
flag = true;//修改标识
|
||||
}
|
||||
//等价变形
|
||||
/*if(flag || m){
|
||||
printf("%d", m);
|
||||
flag = true;//修改标识
|
||||
}*/
|
||||
//不管当前位置数字什么情况,都要尝试下一个位置递归
|
||||
inv1(n / 10);
|
||||
}
|
||||
|
||||
//最大公约数
|
||||
int gcd(int a, int b) {
|
||||
if (!b) return a;
|
||||
return gcd(b, a % b);
|
||||
}
|
||||
|
||||
|
||||
//斐波那契数列[画二叉树说明]
|
||||
LL fib(int n) {
|
||||
if (n == 1) return 1;
|
||||
if (n == 2) return 1;
|
||||
return fib(n - 1) + fib(n - 2);
|
||||
}
|
||||
|
||||
//斐波那契记化搜索+递归版本
|
||||
const int N = 110;
|
||||
int s[N];
|
||||
|
||||
LL fib2(int n) {
|
||||
if (n == 1) return 1;
|
||||
if (n == 2) return 1;
|
||||
if (!s[n - 1]) s[n - 1] = fib2(n - 1);
|
||||
if (!s[n - 2]) s[n - 2] = fib2(n - 2);
|
||||
return s[n - 1] + s[n - 2];
|
||||
}
|
||||
|
||||
|
||||
int main() {
|
||||
//朴素版本
|
||||
inv0(100);
|
||||
inv0(12340567);
|
||||
|
||||
//朴素版本+标志优化
|
||||
inv1(100);
|
||||
inv1(12340567);
|
||||
|
||||
//测试最大公约数
|
||||
cout << gcd(4, 6) << endl;
|
||||
|
||||
//测试斐波那契数列
|
||||
cout << fib(20) << endl;
|
||||
|
||||
//测试斐波那契数列(记忆化搜索+递归版本)
|
||||
cout << fib2(20) << endl;
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user