A 斐波那切数列(fbi)
【问题描述】
斐波那切数列0,1,1,2,3,5,8,13,21,34,55……从第三项起,每一项都是紧挨着的前两项的和。写出计算斐波那切数列的任意一个数据项递归程序。
【输入形式】
输入所求的项数。
【输出形式】
输出数据项的值。
【样例输入】
10
【样例输出】
34
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
# include<iostream>
# include<algorithm>
# include<cmath>
# include<cstdio>
# include<set>
# include<stack>
# include<queue>
# include<map>
# include<string>
# include<cstring>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int > PII;
const int mod=1e9+7;
const int MAX=2e6+10;
const int Time=86400;
const int X=131;
const int inf=0x3f3f3f3f;
const double PI = 1e-4;
double pai = 3.14159265358979323846;
int n, f[MAX];
int main(){
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n;
f[1] = 0; f[2] = 1; f[3] = 1;
for(int i = 4; i <= n ; i++)
f[i] = f[i - 1] + f[i - 2];
cout<<f[n];
return 0;
}
B 倒序数(num)
【问题描述】
用递归算法写程序,输入一个非负整数,输出这个数的倒序数。
【输入形式】
输入一个非负整数(保证个位不为零)。
【输出形式】
输出倒序结果。
【样例输入】
123
【样例输出】
321
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
# include<iostream>
# include<algorithm>
# include<cmath>
# include<cstdio>
# include<set>
# include<stack>
# include<queue>
# include<map>
# include<string>
# include<cstring>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int > PII;
const int mod=1e9+7;
const int MAX=2e6+10;
const int Time=86400;
const int X=131;
const int inf=0x3f3f3f3f;
const double PI = 1e-4;
double pai = 3.14159265358979323846;
ll n , sum;
void fun(ll x){
cout<<x%10;
if(x>=10) fun(x/10);
}
int main(){
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n ;
fun(n);
return 0;
}
C 十进制转换成八进制(change)
【问题描述】
用递归算法,把任一给定的十进制正整数转换成八进制数输出。
【输入形式】
输入一个正整数,表示需要转换的十进制数。
【输出形式】
输出一个正整数,表示转换之后的八进制的数。
【样例输入】
15
【样例输出】
17
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
# include<iostream>
# include<algorithm>
# include<cmath>
# include<cstdio>
# include<set>
# include<stack>
# include<queue>
# include<map>
# include<string>
# include<cstring>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int > PII;
const int mod=1e9+7;
const int MAX=2e6+10;
const int Time=86400;
const int X=131;
const int inf=0x3f3f3f3f;
const double PI = 1e-4;
double pai = 3.14159265358979323846;
ll n ;
int a[MAX],j;
int main(){
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n;
while(n){
a[j++] = n % 8;
n = n / 8;
}
for(int i = j - 1 ; i >= 0 ; i -- )
cout<<a[i];
return 0;
}
D 求N!的值(ni)
【问题描述】
用递归算法,求N!的精确值(N以一般整数输入)。
【样例输入】
10
【样例输出】
10!=3628800
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
# include<iostream>
# include<algorithm>
# include<cmath>
# include<cstdio>
# include<set>
# include<stack>
# include<queue>
# include<map>
# include<string>
# include<cstring>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int > PII;
const int mod=1e9+7;
const int MAX=2e6+10;
const int Time=86400;
const int X=131;
const int inf=0x3f3f3f3f;
const double PI = 1e-4;
double pai = 3.14159265358979323846;
int n ;
double fun(int i)
{
double sum ;
if(i == 1) sum = 1;
else sum = i * fun(i - 1);
return sum;
}
int main(){
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n;
printf("%d!=%lf",n,fun(n));
return 0;
}
E 求最大公约数(gcdmax)
【问题描述】
用递归方法求两个数 m 和 n 的最大公约数。(m>0,n>0)
【输入形式】
输入二个数,即m 和 n 的值。
【输出形式】
输出最大公约数。
【样例输入】
8 6
【样例输出】
gcd=2
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
# include<iostream>
# include<algorithm>
# include<cmath>
# include<cstdio>
# include<set>
# include<stack>
# include<queue>
# include<map>
# include<string>
# include<cstring>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int > PII;
const int mod=1e9+7;
const int MAX=2e6+10;
const int Time=86400;
const int X=131;
const int inf=0x3f3f3f3f;
const double PI = 1e-4;
double pai = 3.14159265358979323846;
ll n , m ;
int main(){
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> m;
printf("gcd=%lld",__gcd(n,m));
return 0;
}
F 双色Hanoi塔问题(hanoi)1
【问题描述】
设A、B、C是3 个塔座。开始时,在塔座A 上有一叠共n 个圆盘,这些圆盘自下而上,由大到小地叠在一起。各圆盘从小到大编号为1,2,……,n,奇数号圆盘着蓝色,偶数号圆盘着红色,如图所示。现要求将塔座A 上的这一叠圆盘移到塔座B 上,并仍按同样顺序叠置。在移动圆盘时应遵守以下移动规则:
规则(1):每次只能移动1 个圆盘;
规则(2):任何时刻都不允许将较大的圆盘压在较小的圆盘之上;
规则(3):任何时刻都不允许将同色圆盘叠在一起;
规则(4):在满足移动规则(1)-(3)的前提下,可将圆盘移至A,B,C 中任一塔座上。
试设计一个算法,用最少的移动次数将塔座A 上的n个圆盘移到塔座B 上,并仍按同样顺序叠置。
对于给定的正整数n,编程计算最优移动方案。
【输入形式】
第1 行是给定的正整数n。
【输出形式】
每一行由一个正整数k和2个字符c1和c2组成,表示将第k个圆盘从塔座c1移到塔座c2上。
【样例输入】
3
【样例输出】
1 A B
2 A C
1 B C
3 A B
1 C A
2 C B
1 A B
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
# include<iostream>
# include<algorithm>
# include<cmath>
# include<cstdio>
# include<set>
# include<stack>
# include<queue>
# include<map>
# include<string>
# include<cstring>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int > PII;
const int mod=1e9+7;
const int MAX=2e6+10;
const int Time=86400;
const int X=131;
const int inf=0x3f3f3f3f;
const double PI = 1e-4;
double pai = 3.14159265358979323846;
int n , k ;
void fun(int n, char a , char c, char b){
if(n == 0 ) return ;
fun(n - 1,a,b,c);
cout<<n<<" "<<a<<" "<<b<<"\n";
fun(n - 1,c,a,b);
}
int main(){
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n ;
fun(n,'A','C','B');
return 0;
}
G 背包问题
【问题描述】
简单的背包问题。设有一个背包,可以放入的重量为s。现有n件物品,重量分别为w1,w2…,wn,(1≤i≤n)均为正整数,从n件物品中挑选若干件,使得放入背包的重量之和正好为s。找到一组解即可。
【输入形式】
第一行是物品总件数和背包的载重量,第二行为各物品的重量。
【输出形式】
若找到一组解,则输出"yes"。
若没有,则输出“no”.
【样例输入】
5 10
1 2 3 4 5
【样例输出】
yes
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
# include<iostream>
# include<algorithm>
# include<cmath>
# include<cstdio>
# include<set>
# include<stack>
# include<queue>
# include<map>
# include<string>
# include<cstring>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int > PII;
const int mod=1e9+7;
const int MAX=2e6+10;
const int Time=86400;
const int X=131;
const int inf=0x3f3f3f3f;
const double PI = 1e-4;
double pai = 3.14159265358979323846;
int n ,m ,v,dp[MAX];
int main(){
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> m ;
for(int i = 1 ; i <= n ; i ++ ){
cin >> v;
for(int j = m ; j >= v ; j -- )
dp[j] = max(dp[j] , dp[j - v] + v);
}
if(dp[m] == m) cout<<"yes";
else cout<<"no";
return 0;
}
H 集合的划分
【问题描述】
【输入形式】
给出n和k。
【输出形式】
n个元素a1,a2,……,an 放入k个无标号盒子中去的划分数S(n,k)。
【样例输入】
10 6
【样例输出】
22827
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
# include<iostream>
# include<algorithm>
# include<cmath>
# include<cstdio>
# include<set>
# include<stack>
# include<queue>
# include<map>
# include<string>
# include<cstring>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int > PII;
const int mod=1e9+7;
const int MAX=2e6+10;
const int Time=86400;
const int X=131;
const int inf=0x3f3f3f3f;
const double PI = 1e-4;
double pai = 3.14159265358979323846;
int n , k ;
int fun(int n, int k){
if(k==0 || n < k) return 0;
if(n == k || k == 1) return 1;
return fun(n - 1,k - 1) + k*fun(n-1,k);
}
int main(){
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> k;
cout<<fun(n,k);
return 0;
}
I 数的计数(Noip2001)
【问题描述】
我们要求找出具有下列性质数的个数(包括输入的自然数n)。先输入一个自然数n(n≤1000),然后对此自然数按照如下方法进行处理:
不作任何处理;
在它的左边加上一个自然数,但该自然数不能超过原数的一半;
加上数后,继续按此规则进行处理,直到不能再加自然数为止。
【输入形式】
自然数n(n≤1000)。
【输出形式】
满足条件的数。
【样例输入】
6
【样例输出】
6
【样例说明】
满足样例条件的数为:
6
16
26
126
36
136
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
# include<iostream>
# include<algorithm>
# include<cmath>
# include<cstdio>
# include<set>
# include<stack>
# include<queue>
# include<map>
# include<string>
# include<cstring>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int > PII;
const int mod=1e9+7;
const int MAX=2e6+10;
const int Time=86400;
const int X=131;
const int inf=0x3f3f3f3f;
const double PI = 1e-4;
double pai = 3.14159265358979323846;
int x,y,z,n;
ll dp[MAX];
int main(){
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n;
for(int i = 1; i <= n ; i ++ ){
dp[i] = 1;
for(int j = i/2 ; j >= 1 ; j -- )
dp[i] += dp[j];
}
cout<<dp[n];
return 0;
}