今日学习总结

试题 算法训练 递归输出数字三角形

提交此题   评测记录  

资源限制

时间限制: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;
}
 

试题 算法训练 瓷砖铺放

资源限制
时间限制:1.0s   内存限制:512.0MB
问题描述
  有一长度为N(1<=N<=10)的地板,给定两种不同瓷砖:一种长度为1,另一种长度为2,数目不限。要将这个长度为N的地板铺满,一共有多少种不同的铺法?
  例如,长度为4的地面一共有如下5种铺法:
  4=1+1+1+1
  4=2+1+1
  4=1+2+1
  4=1+1+2
  4=2+2
  编程用递归的方法求解上述问题。
输入格式
  只有一个数N,代表地板的长度
输出格式
  输出一个数,代表所有不同的瓷砖铺放方法的总数
样例输入
4
样例输出
5
思路:刚开始没有,不知道咋处理,看了下百度,就是递归两种情况,1,和2 的情况,满足条件,计数器加1;

#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;
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值