2014年第五届蓝桥杯省赛C语言B组

本文详细解析了2014年第五届蓝桥杯省赛C语言B组的比赛题目,涵盖啤酒与饮料问题、面条切割、李白打酒、史丰收速算、打印图形、奇怪的分式、六角填数、蚂蚁感冒、地宫取宝和小朋友排队等算法题,涉及逻辑推理、数学建模和递归等多种解题思路。
摘要由CSDN通过智能技术生成

2014年第五届蓝桥杯省赛C语言B组

题目来源:蓝桥杯
作者:GGG166

第一题
题目:啤酒和饮料

啤酒每罐2.3元,饮料每罐1.9元。小明买了若干啤酒和饮料,一共花了82.3元。
我们还知道他买的啤酒比饮料的数量少,请你计算他买了几罐啤酒。
注意:答案是一个整数。请通过浏览器提交答案。
不要书写任何多余的内容(例如:写了饮料的数量,添加说明文字等)。

答案:11

思路:
分析可得出饮料一定小于50瓶的,再用双重循环来列举啤酒和饮料的数目,从而的出啤酒的量;为了方便计算,我把价格和花费都扩大10倍,(见代码1)。

代码1:

#include<iostream>

using namespace std;

int main()
{
   
	int a,b;//a为饮料,b为啤酒 
	for(a=1;a<50;a++){
   
		for(b=0;b<a;b++){
   
			if(b*23+a*19==823){
   
				cout<<b<<endl;
				break;
			}
		}
	}
	return 0;
}

第二题
题目:却面条

一根高筋拉面,中间切一刀,可以得到2根面条。
如果先对折1次,中间切一刀,可以得到3根面条。
如果连续对折2次,中间切一刀,可以得到5根面条。
那么,连续对折10次,中间切一刀,会得到多少面条呢?
答案是个整数,请通过浏览器提交答案。不要填写任何多余的内容。

答案:1025

思路:
模拟切面条过程
切得次数 得到的面条数
1 2 =1+2^0
2 3=2+1=1+2^1
3 5=3+2 =1+2^2
4 9==5+4=1+2^3
5 17=9+8 =1+2^4
… …
从而得出规律,(见代码2)。

代码2:

#include<iostream>

using namespace std;

int main()
{
   
	int ans=2;
	for(int i=1;i<=10;i++){
   
		ans=2*ans-1;
	}
	cout<<ans<<endl; 
	return 0;
} 

第三题
题目:李白打酒

话说大诗人李白,一生好饮。幸好他从不开车。
一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:
无事街上走,提壶去打酒。
逢店加一倍,遇花喝一斗。
这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。
请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb 就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。
注意:通过浏览器提交答案。答案是个整数。不要书写任何多余的内容。

答案:14

思路一:
用一个数组在存放花与店的情况,再用全排列依次检验每一种情况(见代码3-1)。

思路二:
用递归的方法来求出花与店的情况,在此次检验每一种情况(见代码3-2)。

代码3-1:

#include<iostream>
#include<algorithm>

using namespace std;

int arr[15]={
   0,0,0,0,0,0,0,0,0,0,1,1,1,1,1};//0为花  1为店 
int main()
{
   
	int ans=0;
	do{
   
	    int jiu=2;//出门时的酒 
		if(arr[14]!=0) continue;
		//后一次遇到的不是花,结束该次循环 
		for(int i=0;i<15;i++){
   //循环判断店与花 
			if(arr[i]==0){
   
				jiu-=1;
			}
			else{
    
			    jiu*=2;
			} 
		}
		if(jiu==0) ans++;//满足条件,结果自加 
	}while(next_permutation(arr,arr+15));
	cout<<ans<<endl; //输出 
	return 0;
}

代码3-2:

#include<iostream>

using namespace std;

int ans=0;
void f(int dian,int hua,int jiu){
   
	if(dian==0&&hua==0&&jiu==1){
    //店和花都完了,酒还剩1 
	    ans++;
	} 
	if(dian>0) {
    // 遇到店 
	    f(dian-1,hua,jiu*2);
	} 
	if(hua>0){
    //遇到花 
	    f(dian,hua-1,jiu-1);
	} 
}
int main()
{
   
	f(5,9,2);
	cout<<ans<<endl; //输出 
	return 0;
} 

第四题
题目:史丰收速算

史丰收速算法的革命性贡献是:从高位算起,预测进位。不需要九九表,彻底颠覆了传统手算!

速算的核心基础是:1位数乘以多位数的乘法。
其中,乘以7是最复杂的,就以它为例。

因为,1/7 是个循环小数:0.142857…,如果多位数超过 142857…,就要进1
同理,2/7, 3/7, … 6/7 也都是类似的循环小数,多位数超过 n/7,就要进n

下面的程序模拟了史丰收速算法中乘以7的运算过程。

乘以 7 的个位规律是:偶数乘以2,奇数乘以2再加5,都只取个位。

乘以 7 的进位规律是:

满 142857...1,285714...2,428571...3,571428...4,714285...5,857142...6

请分析程序流程,填写划线部分缺少的代码。

//计算个位 
int ge_wei(int a)
{
   
	if(a % 2 == 0)
		return (a * 2) % 10;
	else
		return (a * 2 + 5) % 10;	
}
 
//计算进位 
int jin_wei(char* p)
{
   
	char* level[] = {
   
		"142857",
		"285714",
		"428571",
		"571428",
		"714285",
		"857142"
	};
	
	char buf[7];
	buf[6] = '\0';
	strncpy(buf,p,6);
	
	int i;
	for(i=5; i>=0; i--){
   
		int r = strcmp(level[i], buf);
		if(r<0) return i+1;
		while(r==0){
   
			p += 6;
			strncpy(buf,p,6);
			r = strcmp(level[i], buf);
			if(r<0) return i+1;
			
			
			//______________________________;  //填空
		}
	}
	
	return 0;
}
 
//多位数乘以7
void f(char* s) 
{
   
	int head = jin_wei(s);
	if(head > 0) printf("%d", head);
	
	char* p = s;
	while(*p){
   
		int a = (*p-'0');
		int x = (ge_wei(a) + jin_wei(p+1)) % 10;
		printf("%d",x);
		p++;
	}
	
	prin
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值