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

10 篇文章 1 订阅
10 篇文章 0 订阅

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


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 是另一种解法。

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

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



#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。









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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值