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