2016年第七届蓝桥杯省赛C语言B组

2016年第七届蓝桥杯省赛C语言B组

题目来源:蓝桥杯
作者:GGG166
第一题
题目:煤球数目
有一堆煤球,堆成三角棱锥形。具体:
第一层放1个,
第二层3个(排列成三角形),
第三层6个(排列成三角形),
第四层10个(排列成三角形),

如果一共有100层,共有多少个煤球?
请填表示煤球总数目的数字。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

答案:171700

思路1:
很明显找出每一层的规律,就是每一层煤球的个数等于它的层数乘以层数+1在除以二,最后把100层的煤球加起来(见代码1-1)。
代码1-1:

#include<iostream>
using namespace std;

int main()
{
   
	int f[101],sum=0;//f为层数 
	for(int i=1;i<=100;i++){
    
		f[i]=(i*(i+1))/2;
	} 
	for(int i=1;i<=100;i++){
    
	    sum+=f[i];
	} 
	cout<<sum<<endl;
	return 0;
}

思路2:
很明显,第一层与的二层相差2,第二层与的三层相差3,第三层与的四层相差4,经过推理第i-1层与第i层相差i。再计算出100层的并相加就行了。
代码1-2:

#include<iostream>
using namespace std;

int main()
{
   
    int sum=1,j=2,i=1; //i表示层数,j表示差值 
    for(int k=2;k<=100;k++){
   
    	sum+=(i+j);
    	i+=j;
    	j++;
	}
	cout<<sum<<endl;
	return 0;
}

第二题
题目:生日蜡烛
某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛。
现在算起来,他一共吹熄了236根蜡烛。
请问,他从多少岁开始过生日party的?
请填写他开始过生日party的年龄数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

答案:26

思路:
我就从1到100岁之间,来测试他吹熄了蜡烛的根数,当i~ j岁时统计数目且数目为236就找到了并输出i(见代码2-1),或者用等差数列来求就可以得到公式:(i+j)*(j-1+1)/2=236,并输出i(见代码2-2)。
代码2-1:

#include<iostream>
using namespace std;

int main()
{
   
	int sum=0;//蜡烛的根数
	for(int i=1;i<100;i++){
   
	    for(int j=i;j<100;j++){
   
	    	sum+=j;
	    	if(sum==236){
   //找到了
	    		cout<<i<<endl;
	    		break;
			}
		}
		sum=0;//蜡烛的根数归0
    }
	return 0;  
}

代码2-2:

#include<iostream>
using namespace std;

int main()
{
   
	for(int i=1;i<100;i++){
   
	    for(int j=i;j<100;j++){
   
	    	if(2*236==(i+j)*(j-i+1)){
   //找到了
	    		cout<<i<<endl;
	    		break;
			}
		}
    }
	return 0;  
}

第三题
题目:凑算式
B DEF
A + — + ------- = 10
C GHI
(如果显示有问题,可以参见【图1.jpg】)
在这里插入图片描述

这个算式中A~ I 代表1~9的数字,不同的字母代表不同的数字。
比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。
这个算式一共有多少种解法?
注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。

答案:29

思路1:
用枚举法,列举出来A~ I,再来计算(见代码3-1),该方法简单,但是在写代码时小细节很容易出错,本人不建议。
代码:

#include<iostream>
using namespace std;
int main()
{
   
	int a,b,c,d,e,f,i,g,h,cnt=0;
	for(a=1;a<10;a++)
	    for(b=1;b<10;b++)
		    if(b!=a)
			    for(c=1;c<10;c++)
				    if(c!=a && c!=b) 
				        for(d=1;d<10;d++)
				            if(d!=a && d!=b && d!=c)
				                for(e=1;e<10;e++)
				                    if(e!=a && e!=b && e!=c && e!=d)
				                        for(f=1;f<10;f++)
				                            if(f!=a &&f!=b &&f!=c &&f!=d &&f!=e )
				                                for(g=1;g<10;g++)
				                                    if(g!=a &&g!=b &&g!=c &&g!=d &&g!=e &&g!=f )
				                                        for(h=1;h<10;h++)
				                                            if(h!=a &&h!=b &&h!=c &&h!=d &&h!=e &&h!=f &&h!=g )
				                                                for(i=1;i<10;i++)
				                                                    if(i!=a &&i!=b &&i!=c &&i!=d &&i!=e &&i!=f &&i!=g &&i!=h){
   
																	    //printf("%d%d%d%d%d%d%d%d%d\n",a,b,c,d,e,f,g,h,i);
																	    int k1=(a*c*(g*100+h*10+i)+b*(g*100+h*10+i)+c*(d*100+e*10+f))/(c*(g*100+h*10+i));
																	    int k2=(a*c*(g*100+h*10+i)+b*(g*100+h*10+i)+c*(d*100+e*10+f))%(c*(g*100+h*10+i));
				                                                	    if(k1==10 &&k2==0){
   
				                                                		    //printf("%d+%d/%d+%d%d%d/%d%d%d",a,b,c,d,e,f,g,h,i);
				                                                		    cnt++;
																	    }
															      	}
	cout<<cnt<<endl;
	return 0;
}

思路2:
用全排列来做,注意下标为与数组的对应关系即可(见代码3-2)。本人建议用全排列来解决,最后在给大家手工全排列的原理(见代码3-3)。
代码3-2:

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

int a[9]={
   1,2,3,4,5,6,7,8,9};
int ans=0;
int main(){
   
	do{
   
	    int x=a[3]*100+a[4]*10+a[5];
		int y=a[6]*100+a[7]*10+a[8];		
		if(a[0]+(a[1]*y+a[2]*x)/(a[2]*y)==10 && (a[1]*y+a[2]*x)%(a[2
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值