hnucm-oj1164 - 2021年春季学期《算法分析与设计》练习2
A 1401: 递归求和
题目描述
使用递归编写一个程序,求:
S(n)=1-1/2+1/3-1/4+1/5-1/6+…
输入
多组数据输入,每组输入一个正整数n。
输出
输出S(n)的计算结果(精确到小数点后六位)。
样例输入 Copy
1
样例输出 Copy
1.000000
#include <stdio.h>
#include <stdlib.h>
double fun(int n);
int main()
{
int n;
double a;
while(scanf("%d",&n)!=EOF){
a=fun(n);
printf("%.6lf\n",a);
}
}
double fun(int n)
{
double s=0.0;
if(n==1)
s+=1.0;
else
{
if(n%2==0)
s+=(1.0/n)*(-1.0)+fun(n-1);
else
s+=1.0/n+fun(n-1);
}
return s;
}
B 1405: 倒序输出
题目描述
使用递归编写一个程序,逆序输出一个非负整数。例如输入1234,输出4321(不含前导0)。
输入
多组输入,每组输入一个非负整数。
输出
逆序输出结果,每个结果占一行。
样例输入 Copy
12
1230
0
样例输出 Copy
21
321
0
#include <stdio.h>
#include <stdlib.h>
int fun(int m,int n){
int a=0;
if(m/10==0)
return m+n;
else{
a+=n*10+m%10*10;
n=a;
m=m/10;
return fun(m,n);
}
}
int main()
{
int m;
int a;
while(scanf("%d",&m)!=EOF){
int n=0;
a=fun(m,n);
printf("%d\n",a);
}
return 0;
}
C 1409: 递归计数
题目描述
编写一个递归程序,返回一个字符串中大写字母的数目。例如,输入“AbcD”,输出2。
输入
多组输入,每组包括一个仅由大小写字母组成的字符串。
输出
输出字符串中出现大写字母的数目。
样例输入 Copy
AbcD
样例输出 Copy
2
#include <stdio.h>
#include <stdlib.h>
int fun(char p[]){
int a=0;
int i=0;
while(p[i]!='\0'){
if(p[i]>=65&&p[i]<=90)
a++;
i++;
}
return a;
}
int main()
{
char n[100];
while(scanf("%s",&n)!=EOF){
int a=0;
a=fun(n);
printf("%d\n",a);
}
}
D 1568: Kimi数列
题目描述
Kimi最近在研究一个数列:
- F(0) = 7
- F(1) = 11
- F(n) = F(n-1) + F(n-2) (n≥2)
Kimi称之为Kimi数列。请你帮忙确认一下数列中第n个数是否是3的倍数。
输入
输入包含多组数据。
每组数据包含一个整数n,(0≤n≤30)。
输出
对应每一组输入有一行输出。
如果F(n)是3的倍数,则输出“Yes”;否则输出“No”。
样例输入 Copy
0
1
2
3
4
5
样例输出 Copy
No
No
Yes
No
No
No
#include <stdio.h>
#include <stdlib.h>
int fun(int n);
int main()
{
int n;
int a;
while(scanf("%d",&n)!=EOF){
a=fun(n);
if(a%3==0)
printf("Yes\n");
else
printf("No\n");
}
}
int fun(int n)
{
if(n==0)
return 7;
if(n==1)
return 11;
return fun(n-1)+fun(n-2);
}
E 1402: 蜂房
题目描述
有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。
其中,蜂房的结构如下所示。
输入
多组数据输入,每组数据包含两个正整数a, b,且 a<b。
输出
蜜蜂从蜂房a爬到蜂房b的可能路线数。
样例输入 Copy
1 2
3 4
样例输出 Copy
1
1
#include <stdio.h>
#include <stdlib.h>
int fun(int n);
int main()
{
int m,n;
int a,x;
while(scanf("%d%d",&m,&n)!=EOF){
x=n-m+1;
a=fun(x);
printf("%d\n",a);
}
}
int fun(int x)
{
if(x==1||x==2)
return 1;
return fun(x-1)+fun(x-2);
}
F 1408: 骨牌覆盖
题目描述
用大小为1×2的骨牌铺满一个大小为2×n的长方形方格,编写一个程序,输入n,输出铺放方案总数。例如,输入n=3,即大小为2×3的方格,输出3。3种骨牌铺放方案如下图所示:
输入
多组测试用例,每一组是一个正整数。
输出
每组输出占一行。
只需要输出铺放方案总数,不需要输出具体的铺放方案。
样例输入 Copy
3
样例输出 Copy
3
#include <stdio.h>
#include <stdlib.h>
int fun(int n);
int main()
{
int n;
int a;
while(scanf("%d",&n)!=EOF){
a=fun(n);
printf("%d\n",a);
}
}
int fun(int n)
{
if(n<=2)
return n;
return fun(n-1)+fun(n-2);
}