首页 > 编程语言 > 详细

0709-杭电算法题

时间:2020-07-10 22:05:47      阅读:71      评论:0      收藏:0      [点我收藏+]

母牛的故事

  • 这是去年我们集训的时候写的题,想想还是记得当时是怎么错的,奈何语文还是有限
    个人理解
    关于算法题,我觉得主要还是在于理解上
    首先,是有一头母牛,母牛每年生一头小牛,也就是说,在前三年分别每年是1头,2头,3头
    但是在第四年之后,情况开始发生变化,小牛长大了也可以生小牛了,
    假设之后n年有f(n)头牛,那么f(n)=f(n-1)+f(n-3),意思就是前一年的小牛的数量f(n-1),加上在这一年刚出生小牛的数量f(n-3)【三年前的牛开始生小牛】
#include <stdio.h>

int main(){
    int f[55],i,n;
    while(scanf("%d",&n) !=  EOF && n!=0){
        f[1] = 1,f[2] = 2,f[3] = 3;
        for(i = 4;i<=n;i++){
            f[i] = f[i-3] + f[i-1];
        }
        printf("%d\n",f[n]);
    }
    return 0;
}

汉诺塔Ⅲ

  • 在经典的汉诺塔问题上修改了一下条件,不允许从最左边移动到最右边
    个人理解
    关于递归,习惯性的先拿两个试试,之后再类比,将上面的一个看作是一堆
    在两个的情况下,第一步:将小的从最左边移到中间,再移到最右边,这个时候才能将大的移到中间。此时1+1+1
    第二步:将小的从最右边移到最左边,这个时候大的才能移到最右边。此时1+1+1
    第三步:将小的从最左边移动到最右边,完成。此时1+1
    类比到多个的时候:
    将上面的n-1个看作是整体,移到最右边 f(n-1) 次,大的移到中间 1 次
    将n-1个移到最左边 f(n-1) 次,大的移到最右边 1 次
    将n-1个移到最右边 f(n-1) 次,完成。
    总的就是 f(n)=3*f(n-1)+2 次
#include <stdio.h>
long long f(int n)
{
    if(n == 0){
        return 0;
    }
    if(n == 1){
        return 2;
    }
    return 3*f(n-1)+2;
}

int main()
{
    int n;
    long long count;
    while(scanf("%d",&n) != EOF){
        count = f(n);
        printf("%lld\n",count);
    }
    return 0;
}

十进制数转二进制数

  • 这个的方法比较多,本来我想的是通过栈的方式,但是觉得比较麻烦,用数组模拟栈吧
    个人理解
    将十进制数和二取余,将其存入一个数组,得到的数组就是倒叙的二进制数,之后在输出的时候再倒序输出就行了
#include <stdio.h>
int main()
{
    int x;
    while(scanf("%d",&x) != EOF){
        int a,b[100],j=0;
        for(;j<100;j++){
            a = x%2;
            b[j] =  a;
            x = x/2;
            if(x == 0)
                break;
        }
        for(j;j>=0;j--)
            printf("%d",b[j]);
        printf("\n");
    }
    return 0;
}

0709-杭电算法题

原文:https://www.cnblogs.com/Indomite/p/13281276.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!