1. 程式人生 > >第七屆藍橋杯大賽個人賽省賽(軟體類)B組真題

第七屆藍橋杯大賽個人賽省賽(軟體類)B組真題

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

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。