试题 算法训练 递归输出数字三角形
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
输出一个n行的与样例类似的数字三角形,必须使用递归来实现
输入格式
一个正整数数n,表示三角形的行数
输出格式
输出一个与样例类似的n行的数字三角形,同一行每两个数之间用一个空格隔开即可(图中只是为防止题面格式化而用'_'代替空格)
样例输入
4
样例输出
___1
__2_3
_4_5_6
7_8_9_10
数据规模和约定
n<=20
思路:就和输出三角形一样,就是用递归写的话有点难,我对递归不是很熟
#include <iostream>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <stdio.h>
#include <algorithm>
using namespace std;
void f(int a)//递归函数
{
static int i=1;//数字在增大,所以也要变
static int j=a;//控制输出空格
int t;
if(a==1)//递归出口
{
for(t=j-1;t>0;t--)
cout<<' ';
for(t=0;t<a;t++,i++)
cout<<i<<' ';
cout<<endl;
j--;
}
else
{
f(a-1);
for(t=j-1;t>0;t--)
cout<<' ';
j--;
for(t=0;t<a;t++,i++)
cout<<i<<' ';
cout<<endl;
}
}
int main()
{
int n;
cin>>n;
f(n);
return 0;
}
试题 算法训练 递归输出数字
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
写一个递归程序,输入一个整数,按从高位到低位的顺序输出其所有数字,每两个数字中间用空格格开。例如,输入整数12345,输出1 2 3 4 5。请进一步思考如何修改程序,才能输出数字取反后的整数,即在上例中输出整数54321。注意这里的进一步思考仅供个人练习,不要提交到作业程序中,即最后的结果不要输出54321,否则自动判题程序会出错
输入格式
输入一个整数n(1<=n<=100000)
输出格式
按从高位到低位的顺序输出其所有数字,每两个数字中间用空格隔开(最后多一个空格也没关系)
样例输入
54321
样例输出
5 4 3 2 1
思路:和把整数分开差不多,就是要用递归写
#include <iostream>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <stdio.h>
#include <algorithm>
using namespace std;
void f(int n)
{
if(n/10==0)//递归出口
{
cout<<n<<' ';
}
else
{
f(n/10);
cout<<n%10<<' ';
}
}
int main()
{
int n;
cin>>n;
f(n);
return 0;
}
试题 算法训练 斐波拉契数列
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
有一个数列,它的第一项是1,第二项是2,第三项是第一项与第二项的和,后面的项依次类推,即F(1)=1,F(2)=2,F(n)=F(n-1)+F(n-2)(n≥3,n∈N*),请使用递归函数编写程序,对于从键盘输入的整数n,计算并输出F(n)的值。
输入格式
输入一个整数n(1<=n<=20)
输出格式
输出F(n)的值
样例输入
4
样例输出
5
思路:这题较简单,思路就在题目里
#include <iostream>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <stdio.h>
#include <algorithm>
using namespace std;
int f(int n)
{
int x=0;
if(n==1)
return 1;
if(n==2)
return 2;
else
{
x=f(n-1)+f(n-2);
}
return x;
}
int main()
{
int n;
cin>>n;
n=f(n);
cout<<n;
return 0;
}
试题 算法训练 最大公约数
资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
求两个整数的最大公约数是一个很有价值的问题,给定整数a和b,下面的方法可以较快速的求出a和b的最大公约数。
如果a是b的倍数,则a和b的最大公约数为b,否则a和b的最大公约数等于b和a%b的最大公约数。其中a%b表示a除b的余数。
如,要求48和72的最大公约数,用(48,72)来表示,则可以按下面的过程来求:
(48,72)=(72,48)=(48,24)=24。
给出a和b,用递归的方式来求a和b的最大公约数。
输入格式
输入的第一行包含两个整数a, b。
输出格式
输出两个数的最大公约数。
样例输入
48 72
样例输出
24
思路:在题目里有思路了,主要这题就只要写函数里面部分
int gcd(int a, int b)//函数部分
{
int c,d;
c=a>b?a:b;
d=a<b?a:b;
if(c%d==0)
{
return d;
}
else
{
gcd(d,c%d);
}
}
试题 算法训练 s01串
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
s01串初始为"0"
按以下方式变换
0变1,1变01
输入格式
1个整数(0~19)
输出格式
n次变换后s01串
样例输入
3
样例输出
101
数据规模和约定
0~19
思路:从0开始判断,根据题意变化,在1的时候,要向后移一位,把01加入,数组要开大一些
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
char a[10000];//字符串
void f(int n)
{
if(n==0)//递归出口
{
a[0]='0';
}
else
{
f(n-1);
for(int i=0;i<10000;i++)//开始改变
{
if(a[i]=='-')//退出
break;
if(a[i]=='0')
a[i]='1';
else if(a[i]=='1')
{
a[i]='0';
if(a[i+1]=='-')//判断后移
{
a[i+1]='1';
break;
}
else
{
int j;
for(j=i+2;;j++)//找到后移的位置
if(a[j]=='-')
break;
for(;j>i;j--)//开始后移
a[j]=a[j-1];
a[i+1]='1';
i++;//接着下一位判断
}
}
}
}
}
int main()
{
int n;
cin>>n;
for(int i=0;i<10000;i++)//赋初值
a[i]='-';
f(n);
for(int i=0;i<10000;i++)//输出
{
if(a[i]!='-')
cout<<a[i];
else
break;
}
return 0;
}
试题 算法训练 瓷砖铺放
例如,长度为4的地面一共有如下5种铺法:
4=1+1+1+1
4=2+1+1
4=1+2+1
4=1+1+2
4=2+2
编程用递归的方法求解上述问题。
#include <iostream>
#include <algorithm>
using namespace std;
int n,cnt=0;
void f(int k)
{
if(k>n)
return;
if(k==n)
cnt++;
f(k+1);
f(k+2);
}
int main()
{
cin>>n;
f(0);
cout<<cnt;
return 0;
}
试题 算法训练 2的次幂表示
资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
任何一个正整数都可以用2进制表示,例如:137的2进制表示为10001001。
将这种2进制表示写成2的次幂的和的形式,令次幂高的排在前面,可得到如下表达式:137=2^7+2^3+2^0
现在约定幂次用括号来表示,即a^b表示为a(b)
此时,137可表示为:2(7)+2(3)+2(0)
进一步:7=2^2+2+2^0 (2^1用2表示)
3=2+2^0
所以最后137可表示为:2(2(2)+2+2(0))+2(2+2(0))+2(0)
又如:1315=2^10+2^8+2^5+2+1
所以1315最后可表示为:
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
输入格式
正整数(1<=n<=20000)
输出格式
符合约定的n的0,2表示(在表示中不能有空格)
样例输入
137
样例输出
2(2(2)+2+2(0))+2(2+2(0))+2(0)
样例输入
1315
样例输出
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
提示
用递归实现会比较简单,可以一边递归一边输出
思路:用二进制来处理会简单些,但不是很会,参考了一下网上的,就是用数组逆序存二进制,然后分位输出。
#include <iostream>
#include <algorithm>
using namespace std;
void f(int k)
{
int a[100],t=0,i,g;
while(k)//二进制存
{
a[t++]=k%2;
k/=2;
}
for(i=t-1;i>=0;i--)//判位
if(a[i])
g=i;
for(i=t-1;i>=0;i--)
{
if(a[i])//输出部分
{
if(i>2)
{
cout<<"2(";
f(i);
cout<<')';
}
else if(i==1)
cout<<'2';
else
cout<<"2("<<i<<')';
if(i!=g)
cout<<'+';
}
}
}
int main()
{
int n;
cin>>n;
f(n);
return 0;
}
试题 算法训练 十进制转2进制输出
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
编写递归函数,实现将一个十进制的正整数以二进制的形式输出。
注:不考虑符号位,仅从二进制数不为0的最高位开始输出。
输入格式
一个十进制正整数
输出格式
该整数对应的二进制数
样例输入
一个满足题目要求的输入范例。
例:
96
样例输出
与上面的样例输入对应的输出。
例:
1100000
思路:简单题,就是转换为二进制的方法
#include <iostream>
using namespace std;
void f(int k)
{
if(k/2==0)
{
cout<<k;
}
else
{
f(k/2);
int b;
b=k%2;
cout<<b;
}
}
int main()
{
int n;
cin>>n;
f(n);
return 0;
}
试题 算法训练 台阶问题
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
楼梯有N(N<25)级台阶,上楼时一步可以走一级台阶,也可以走二级或三级台阶。请编写一个递归程序,计算共有多少种不同的走法?
样例输入
3
样例输出
4
思路:和瓷砖铺放一样的思路,代码也差不多
#include <iostream>
using namespace std;
int n;
int cnt=0;
void f(int k)
{
if(k>n)
return;
if(k==n)
cnt++;
f(k+1);
f(k+2);
f(k+3);
}
int main()
{
cin>>n;
f(0);
cout<<cnt;
return 0;
}