第七屆藍橋杯大賽個人賽省賽(軟體類)B組真題
阿新 • • 發佈:2019-01-04
本文持續更新,直至更完。
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。