You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
|
|
#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;
|
|
|
|
|
}
|