2014年蓝桥杯省赛C++B组真题与题解

1 啤酒和饮料

题目:

啤酒每罐2.3元,饮料每罐1.9元。小明买了若干啤酒和饮料,一共花了82.3元。

我们还知道他买的啤酒比饮料的数量少,请你计算他买了几罐啤酒。

注意:答案是一个整数。请通过浏览器提交答案。

不要书写任何多余的内容(例如:写了饮料的数量,添加说明文字等)。

题解:
本题可以用Excel逐个递推出答案,依次枚举啤酒的数量,减去啤酒花的钱之后剩余的钱除以饮料的价钱第一次能够除尽时,当前啤酒数量即为需要的答案。表格操作如下: 在这里插入图片描述

2 切面条

题目:

一根高筋拉面,中间切一刀,可以得到2根面条。

如果先对折1次,中间切一刀,可以得到3根面条。

如果连续对折2次,中间切一刀,可以得到5根面条。

那么,连续对折10次,中间切一刀,会得到多少面条呢?

答案是个整数,请通过浏览器提交答案。不要填写任何多余的内容。

题解:
已知对折0次,得到2根面条;对折1次,得到3根面条;对折2次,得到5根面条,可推知对折n次,得到2^n+1 根面条,由表格可计算出对折10次,得到2^10+1=1025根面条。在这里插入图片描述

3 李白打酒

题目:

话说大诗人李白,一生好饮。幸好他从不开车。

一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:

无事街上走,提壶去打酒。
逢店加一倍,遇花喝一斗。

这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。

请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb
就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。

注意:通过浏览器提交答案。答案是个整数。不要书写任何多余的内容。

题解:
已知初始状态酒数量为2,遇到店酒数量乘2,遇到花酒数量-1,共遇到店5次,遇到花10次,求李白遇到店和花次序的可能方案个数。计算方案数这类问题使用深搜方法,已知最后一次遇到花,则前面遇到花9次,店5次,则店和花数量为0,酒数量为1即得到一种方案。代码如下:

#include<iostream>

using namespace std;

int ans;

void dfs(int shop, int flower, int wine)
{
   
	if (!shop && !flower && wine == 1) ans ++;
	if (shop) dfs(shop - 1, flower, wine * 2);
	if (flower) dfs(shop, flower - 1, wine - 1);
}

int main()
{
   
	dfs(5, 9, 2);
	cout << ans << endl;
    return 0;
}

4 史丰收速算

题目:

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

速算的核心基础是: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++;
	}
	
	printf("\n");
}

int main()
{
   
	f("428571428571");
	f("34553834937543");		
	return 0;
}

注意:通过浏览器提交答案。只填写缺少的内容,不要填写任何多余的内容(例如:说明性文字)

题解:
多位数乘以7,使用不同的进位制,从高位算起,每一位分别由其个位数和进位的数决定,个位数遵循偶数乘2,奇数乘2再加5的规律,进位则需借用字符串的拷贝,从高位到低位拷贝6位数字与每一个进制比较,若大于该进制,则得到进位;若等于该进制,则继续比较后面六位数字;若小于该进制,则说明不足以进位,需要进小一点的位。读完源程序发现没有用于处理小于进制时的代码,则需要在填空处添加。代码及注释如下:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;

//计算个位 
int ge_wei(int a)
{
   
	if(a % 2 == 0)
		return (a * 2) % 10;//偶数乘2 
	else
		return (a * 2 + 5) % 10;//奇数乘2加5	
}

//计算进位 
int jin_wei(char* p)
{
   
	char* level[] = {
   
		"142857",
		"285714",
		"428571",
		"571428",
		"714285",
		"857142"
	};//存储每个进制 
	
	char buf[7];
	buf[6] = '\0';
	strncpy(buf,p,6);//拷贝从p前6位字符串到buf中 
	
	int i;
	for(i=
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值