母牛的故事
- 这是去年我们集训的时候写的题,想想还是记得当时是怎么错的,奈何语文还是有限
个人理解
关于算法题,我觉得主要还是在于理解上
首先,是有一头母牛,母牛每年生一头小牛,也就是说,在前三年分别每年是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
",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
",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("
");
}
return 0;
}