第七届蓝桥杯大赛个人赛省赛(软件类)B组真题

时间:2022-09-10 16:28:10

本文持续更新,直至更完。


1.网友年龄

某君新认识一网友。
当问及年龄时,他的网友说:
“我的年龄是个2位数,我比儿子大27岁,
如果把我的年龄的两位数字交换位置,刚好就是我儿子的年龄”
请你计算:网友的年龄一共有多少种可能情况?
提示:30岁就是其中一种可能哦.

请填写表示可能情况的种数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

#include<stdio.h>
int main()
{
int d=27,i=0,s;//给父亲初始值赋27
for(d=27;d<100;d++)
{
s=d-27;
//d/10+d%10*10 用于将父亲年龄数字交换位置
if(s==(d/10+d%10*10))
{
i++;
printf("%d\t",d);
}
}
printf("\n%d\n",i);
return 0;
}

运行结果为:

30      41      52      63      74      85      96

共7种;


2.生日蜡烛

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

#include<stdio.h>
int main()
{
int i,j;//i开始过生日的年龄,j代表现在的年龄
int sum;
for(i=1;i<100;i++)
{
sum=0;
for(j=i;;j++)
{
//此处用到等差数列求和公式
sum=(j-i+1)*(j+i);
if(sum==(236*2))
printf("%d\n",i);
if(sum>(236*2))
break;
}
}
return 0;
}

结果为26,即从26岁开始过生日,现在刚好33岁。


3.凑算式


     B      DEF
A + --- + ------- = 10
     C      GHI
     
(如果显示有问题,可以参见【图1.jpg】)
   
这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。

比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。

这个算式一共有多少种解法?

注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。

第七届蓝桥杯大赛个人赛省赛(软件类)B组真题


#include<stdio.h>
#include<string.h>

int main()
{
double num[9];
double A,B,C,D,E,F,G,H,I,fin; //5 9
int j,a,b,c,d,e,f,g,h,i,count=0;

for(a=0;a<9;a++)
{
for(j=0;j<9;j++)
num[j]=j+1;//num赋值
A=num[a];
for(b=0;b<9;b++)
{
B=num[b];
if(B!=A)
{
for(c=0;c<9;c++)
{
C=num[c];
if(A!=C&&B!=C)
{
for(d=0;d<9;d++)
{
D=num[d];
if(D!=A&&D!=B&&D!=C)
for(e=0;e<9;e++)
{
E=num[e];
if(E!=A&&E!=B&&E!=C&&E!=D)
{
for(f=0;f<9;f++)
{
F=num[f];
if(F!=A&&F!=B&&F!=C&&F!=D&&F!=E)
{
for(g=0;g<9;g++)
{
G=num[g];
if(G!=A&&G!=B&&G!=C&&G!=D&&G!=E&&G!=F)
{
for(h=0;h<9;h++)
{
H=num[h];
if(H!=A&&H!=B&&H!=C&&H!=D&&H!=E&&H!=F&&H!=G)
{
for(i=0;i<9;i++)
{
I=num[i];
if(I!=A&&I!=B&&I!=C&&I!=D&&I!=E&&I!=F&&I!=G&&I!=H)

{
fin=A+B/C+(D*100+E*10+F)/(G*100+H*10+I);
if(fin==10)
count++;
}

}
}
}
}
}
}
}
}
}
}
}
}
}
}
}

printf("%d\n",count);
return 0;

}


结果是29种。

如果你觉得上面的这些判断语句太麻烦,也太多了的话。我们就可以再定义一个temp数组来解决互不相同的问题。完整代码如下

#include<stdio.h>
int main()
{
//double num[9];
int a[10];
int temp[10],count=0,i,sum=0;
//double fin; //5 9
for(a[1]=1;a[1]<=9;a[1]++)
for(a[2]=1;a[2]<=9;a[2]++)
for(a[3]=1;a[3]<=9;a[3]++)
for(a[4]=1;a[4]<=9;a[4]++)
for(a[5]=1;a[5]<=9;a[5]++)
for(a[6]=1;a[6]<=9;a[6]++)
for(a[7]=1;a[7]<=9;a[7]++)
for(a[8]=1;a[8]<=9;a[8]++)
for(a[9]=1;a[9]<=9;a[9]++)
{
for(i=1;i<=9;i++)
temp[i]=0;//temp都赋值为0
for(i=1;i<=9;i++)
temp[a[i]]=1;//如果9个a[i]不同时,temp都为1
sum=0;
for(i=1;i<=9;i++)
sum+=temp[i];
//在此处要用到类型强制转换,否则会有精度丢失;
if(sum==9&&10==a[1]+(double)a[2]/a[3]+(double)(a[4]*100+a[5]*10+a[6])/(a[7]*100+a[8]*10+a[9]))
{
count++;
printf("%d+%d/%d+%d%d%d/%d%d%d=10\n",a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]);
}
}
printf("%d\n",count);
return 0;
}

其中核心代码是

for(i=1;i<=9;i++)
temp[i]=0;//temp都赋值为0
for(i=1;i<=9;i++)
temp[a[i]]=1;//如果9个a[i]不同时,temp都为1
sum=0;
for(i=1;i<=9;i++)
sum+=temp[i];


每次循环开始,temp[i]都赋值为0。当a[i]不相同时,temp[a[i]]都等于1。如果存在a[i]相等,那么存在temp[]=0;因此当a[i]互不相同时,sum在for循环

之后为10。