2014年第五届蓝桥杯C/C++组真题补充训练(一,未完待续,2017.3.6)

1. (C组T1 2')武功秘籍

    小明到X山洞探险,捡到一本有破损的武功秘籍(2000多页!当然是伪造的)。他注意到:书的第10页和第11页在同一张纸上,但第11页和第12页不在同一张纸上。

    小明只想练习该书的第81页到第92页的武功,又不想带着整本书。请问他至少要撕下多少张纸带走?

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

【分析】与正常书本的标页码方式不同,这本武功秘籍的标页码方式是 1 23 45 67 89 1011 1213……(两数字挨着说明这两个页码在书的同一页),可以笔算模拟求解,也可编程。

源代码:

#include <stdio.h>
int main()
{
	int start,end;                            //起始页码与终止页码 
	int i,count;                              //count记录所需纸张数 
	while(scanf("%d %d",&start,&end)!=EOF)
	{
		count=1;                          //count赋初值1,表示起始页码所在页为第1页
		for(i=start+1;i<=end;i++)         //遇到偶数页码,纸张数+1
		{
			if(i%2==0)
				count++;
		}
		printf("%d\n",count);
	}
	return 0;
}
程序截图:


【答案】7

2. (C组T2 4')等额本金


    小明从银行贷款3万元。约定分24个月,以等额本金方式还款。


    这种还款方式就是把贷款额度等分到24个月。每个月除了要还固定的本金外,还要还贷款余额在一个月中产生的利息。


    假设月利率是:0.005,即:千分之五。那么,


    第一个月,小明要还本金 1250, 还要还利息:30000 * 0.005,总计 1400.00
    第二个月,本金仍然要还 1250, 但利息为:(30000-1250) * 0.005 总计 1393.75


    请问:小明在第15个月,应该还款多少(本金和利息的总和)?


    请把答案金额四舍五入后,保留两位小数。注意:32.5,一定要写为:32.50


    通过浏览器提交答案,这是一个含有小数点和两位小数的浮点数字。不要写多余内容(例如:多写了“元”或添加说明文字)

【分析】推出公式直接求解

源代码:

#include <stdio.h>
int main()
{
	int i,n;                 //n-第n个月 
	double money=1250,sum;
	while(scanf("%d",&n)!=EOF)
	{
		sum=money+(30000-(n-1)*money)*0.005;
		printf("%.2lf\n",sum);
	}
	return 0;
}
程序截图:


【答案】1312.50

3. (C组T3 6')猜字母


    把abcd...s共19个字母组成的序列重复拼接106次,得到长度为2014的串。


    接下来删除第1个字母(即开头的字母a),以及第3个,第5个等所有奇数位置的字母。


    得到的新串再进行删除奇数位置字母的动作。如此下去,最后只剩下一个字母,请写出该字母。


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

【分析】串操作

源代码:

#include <stdio.h>
#include <string.h>
#define maxlen 2015
int main()
{
	int i;
	int j=0,k,time=0;           //time记录拼接次数 
	char str[maxlen];
	while(time<106)             //j记录"a~s"串拼接106次后的字符串的长度及其后续变化过程 
	{
		for(i=0;i<19;i++)
			str[j++]='a'+i;
		time++;
	}
	str[j]='\0';
	//printf("%d\n",j);         //(测试用)输出拼接106次后的串 
	//printf("%s\n",str);
	while(j!=1)                 //串长不为1时,取串中所有偶数位置的字母 
	{
		k=0;
		for(i=0;i<j;i++)
		{
			if(i%2!=0)
				str[k++]=str[i];
		}
		str[k]='\0';
		j=k;                    //把新的串长k赋值给j,继续循环,直到串长为1时结束 
		//printf("%d\n",j);     //(测试用)输出每一步删除操作后的串 
		//printf("%s\n",str);
	} 
	printf("%s\n",str);         //输出最后剩下的一个字母 
	return 0;
}
程序截图:




【答案】q

另:参考自csdn,补充一种解

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值