第四届蓝桥杯解题

目标题: 第39级台阶


    小明刚刚看完电影《第39级台阶》,离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级!


    站在台阶前,他突然又想着一个问题:


    如果我每一步只能迈上1个或2个台阶。先迈左脚,然后左右交替,最后一步是迈右脚,也就是说一共要走偶数步。那么,上完39级台阶,有多少种不同的上法呢?




    请你利用计算机的优势,帮助小明寻找答案。


要求提交的是一个整数。

注意:不要提交解答过程,或其它的辅助说明文字。


#include<stdio.h>
#include<time.h>

void left1(int);
void left2(int);
void right1(int);
void right2(int);

long num = 0;


void left2(int now){
	now += 2;
	right1(now);
	right2(now);
}

void left1(int now){
	now++;
	right1(now);
	right2(now);
}

void right2(int now){
	now += 2;
	if (now>39) {  return; }
	if (now == 39) { num++; return; }
	left1(now);
	left2(now);
	
}

void right1(int now){
	now++;
	if (now >39) { return; }
	if (now == 39) { num++;return; }
	left1(now);
	left2(now);
	
}

void main(){
	int now=0;
	left1(now);
	left2(now);
	printf("%d\n", num);
	printf("%d\n",clock());
}


采用模拟上台阶的方法,只在右脚判断是否为第39级台阶。




标题: 黄金连分数




    黄金分割数0.61803... 是个无理数,这个常数十分重要,在许多工程问题中会出现。有时需要把这个数字求得很精确。


    对于某些精密工程,常数的精度很重要。也许你听说过哈勃太空望远镜,它首次升空后就发现了一处人工加工错误,对那样一个庞然大物,其实只是镜面加工时有比头发丝还细许多倍的一处错误而已,却使它成了“近视眼”!!




    言归正传,我们如何求得黄金分割数的尽可能精确的值呢?有许多方法。


    比较简单的一种是用连分数:


                  1
    黄金数 = ---------------------
                        1
             1 + -----------------
                          1
                 1 + -------------
                            1
                     1 + ---------
                          1 + ...


                           


    这个连分数计算的“层数”越多,它的值越接近黄金分割数。


    请你利用这一特性,求出黄金分割数的足够精确值,要求四舍五入到小数点后100位。


    小数点后3位的值为:0.618
    小数点后4位的值为:0.6180
    小数点后5位的值为:0.61803
    小数点后7位的值为:0.6180340
   (注意尾部的0,不能忽略)


你的任务是:写出精确到小数点后100位精度的黄金分割值。


注意:尾数的四舍五入! 尾数是0也要保留!


显然答案是一个小数,其小数点后有100位数字,请通过浏览器直接提交该数字。
注意:不要提交解答过程,或其它辅助说明类的内容。


# include <stdio.h>
#include<windows.h>
#include<math.h>
# define F 50


int main(void)
{
	int m;
	unsigned __int64 fib[1000];
	int f = 0;
	int a[101];
	for (m = 0; m < 1000; m++)
		fib[m] = 0;
	fib[0] = 0;
	fib[1] = 1;
	printf("%lld\n", (unsigned __int64)(pow((float)10, 18)));
	for (int i = 2; fib[i] <(unsigned __int64)(pow((float)10, 18)); i++) {
		fib[i] =fib[i - 1] + fib[i - 2];
		
		f++;
	}
	printf("%d\n", f);
	unsigned __int64 x = fib[F - 2];
	unsigned __int64 y = fib[F - 1];
	printf("%lld,%lld\n", x, y);
	for (int i = 0; i < 101; i++) {
		printf("%d", x / y);
		//a[i] = ;
		x = (x % y) * 10;
		
	}
	getchar();
	return 0;
}


这个算法是将网上的错误算法经过分析后得到的能正常得出结果的算法





标题: 振兴中华


    小明参加了学校的趣味运动会,其中的一个项目是:跳格子。


    地上画着一些格子,每个格子里写一个字,如下所示:(也可参见p1.jpg)


从我做起振
我做起振兴
做起振兴中
起振兴中华




    比赛时,先站在左上角的写着“从”字的格子里,可以横向或纵向跳到相邻的格子里,但不能跳到对角的格子或其它位置。一直要跳到“华”字结束。




    要求跳过的路线刚好构成“从我做起振兴中华”这句话。


    请你帮助小明算一算他一共有多少种可能的跳跃路线呢?


答案是一个整数,请通过浏览器直接提交该数字。
注意:不要提交解答过程,或其它辅助说明类的内容。


#include<stdio.h>

int num = 0;

int a[4][5] = {
	{ 1, 2, 3, 4, 5 },
	{ 2, 3, 4, 5, 6 },
	{ 3, 4, 5, 6, 7 },
	{ 4, 5, 6, 7, 8 }
};

void dfs(int i, int j,int m){
	if (a[i][j] == 8) {
		num++; return;
	}
	if (a[i][j] - m == 1)
	{
		if (i + 1 < 4) dfs(i+1,j,a[i][j]);
		if (j + 1 < 5) dfs(i,j+1,a[i][j]);
	}
		
}

void main(){
	int i=0, j=0,m=0;
	dfs(i,j,m);
	printf("%d",num);
	getchar();
}

采用矩阵和dfs算法得出结果。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值