1. 程式人生 > >藍橋杯校賽題目以及解析

藍橋杯校賽題目以及解析

題目一

輸入一個字串,求它包含多少個單詞。單詞間以一個或者多個空格分開。

第一個單詞前,最後一個單詞後也可能有0到多個空格。

比如:" abc    xyz" 包含兩個單詞,"ab   c  xyz    "  包含3個單詞。

如下的程式解決了這個問題,請填寫劃線部分缺失的程式碼。

注意:只填寫劃線部分的程式碼,不要填寫任何多餘的內容。比如已經存在的小括號,註釋或說明文字等。

int get_word_num(char* buf)

{

         intn = 0;  

         inttag = 1;

         char*p = buf;

         for(;*p!=0&& *p!=13 && *p!=10;p++)//個人感覺 *p!=13 && *p!=10,

這裡有點多餘,

//好像字元數組裡面不能儲存換行和回車符吧,所以也就不需要判斷字元是否為換行和回車符了。

{

                   if(*p=='' && tag==0) tag=1;

                   if(_____________________ ) //填空

 { 

n++;

tag=0;

 } 

         }

         returnn;

}

int main()

{

         charbuf[1000];

         fgets(buf,1000,stdin);

         printf("%d\n",get_word_num(buf));

         return0;

}

解析:橫線部分填:((*p>='a' && *p<='z')||(*p>='A' && *p<='Z'))&&(tag==1);

題目二

1/1 + 1/2 + 1/3 + 1/4 + ... 在數學上稱為調和級數。

它是發散的,也就是說,只要加上足夠多的項,就可以得到任意大的數字。

但是,它發散的很慢:

前1項和達到 1.0

前4項和才超過 2.0

前83項的和才超過 5.0

那麼,請你計算一下,要加多少項,才能使得和達到或超過 15.0 呢?

請填寫這個整數。

注意:只需要填寫一個整數,不要填寫任何多餘的內容。比如說明文字。

答案:1835421;

程式碼如下:

#include<stdio.h>
int main()
{
double  i=1.0;
double sum=0.0;
int count=0;
for(;sum<=15.0;i++)
{
sum=sum+(1.0/i);


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

題目三

如果x的x次冪結果為10,你能計算出x的近似值嗎?

顯然,這個值是介於2和3之間的一個數字。

請把x的值計算到小數後6位(四捨五入),並填寫這個小數值。

注意:只填寫一個小數,不要寫任何多餘的符號或說明。

答案:2.506184

完整程式碼如下:

#include <cstdio>
#include <cmath>
int main()
 {
double x=2.4;
for(;x<3;x+=0.00000001)
{
if(fabs((pow(x,x)-10.0))<0.000001)
{
printf("%.8lf\n",x);
}
}
return 0;
}


題目四

合數,指自然數中除了能被1和本身整除外,還能被其他的數整除(不包括0,1)的數。與之相對的是質數(因數只有1和它本身,如2,3,5,7,11,13等等,也稱素數)。

已知n=99999999是一個合數,那麼能被他整除的數有幾個(1和本身除外):

合數n=9999999,能被他整除的數又有幾個(1和本身除外):

程式碼如下:可以自己修改程式中n的值。

#include<stdio.h>
int main()
{
long long n=9999999;
int count=0;
for(int i=2;i<n;i++)
{
if(n%i==0)
{
count++;
printf("%d  ",i);
}

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

題目五

從鍵盤上輸入一個整數n,要求計算n+nn+nnn+nnnn+nnnnn+......(共n項)的和,

例如n=5,

則計算5+55+555+5555+55555的結果

【資料格式】

輸入一個整數 n (0<n<10) 。

要求輸出一個整數,計算結果。

例如,輸入:

5

程式應該輸出:

61725

再例如,輸入:

3

程式應該輸出:

369

資源約定:

峰值記憶體消耗(含虛擬機器) < 256M

CPU消耗  < 1000ms

請嚴格按要求輸出,不要畫蛇添足地列印類似:“請您輸入...”的多餘內容。

所有程式碼放在同一個原始檔中,除錯通過後,拷貝提交該原始碼。

注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。

注意:主類的名字必須是:Main,否則按無效程式碼處理。

完整程式碼如下:

#include<stdio.h>
int main()
{
int i=1,n;
    long long sum1=0.0,sum2=0.0;

scanf("%d",&n);

for(sum2=sum1=n;i<n;i++)
{
sum1=sum1*10+n; 
sum2+=sum1;

printf("%lld\n",sum2);


return 0;

讀者可以自行執行結果。

題目六

  勾股定理,西方稱為畢達哥拉斯定理,它所對應的三角形現在稱為:直角三角形。

  已知直角三角形的斜邊是某個整數,並且要求另外兩條邊也必須是整數。

  求滿足這個條件的不同直角三角形的個數。

【資料格式】

輸入一個整數 n (0<n<10000000) 表示直角三角形斜邊的長度。

要求輸出一個整數,表示滿足條件的直角三角形個數。

例如,輸入:

5

程式應該輸出:

1

再例如,輸入:

100

程式應該輸出:

2

再例如,輸入:

3

程式應該輸出:

0

資源約定:

峰值記憶體消耗(含虛擬機器) < 256M

CPU消耗  < 1000ms

請嚴格按要求輸出,不要畫蛇添足地列印類似:“請您輸入...”的多餘內容。

所有程式碼放在同一個原始檔中,除錯通過後,拷貝提交該原始碼。

注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。

注意:主類的名字必須是:Main,否則按無效程式碼處理。

完整程式碼如下:

#include<stdio.h>
#include<math.h>
int main()
{
int a,b,c,c2,b2,count=0;
scanf("%d",&c);
c2=c*c;
for(a=1;a<c/sqrt(2);a++) 
{
b=sqrt(c2-a*a);
if((a*a+b*b)==c2)
{
count++;
}
}
printf("%d\n",count);

return 0;

題目七

輸出一個數字n,計算(0 - n)之間所有數字的全排列。

【資料格式】

輸入一個整數 n (0<n<10) 。

要求輸出(1 - n)之間所有數字的全排列,中間逗號分開。

例如,輸入:

3

程式應該輸出:

1,2,3

1,3,2

2,1,3

2,3,1

3,1,2

3,2,1

再例如,輸入:

2

程式應該輸出:

1,2

2,1

資源約定:

峰值記憶體消耗(含虛擬機器) < 256M

CPU消耗  < 1000ms

請嚴格按要求輸出,不要畫蛇添足地列印類似:“請您輸入...”的多餘內容。

所有程式碼放在同一個原始檔中,除錯通過後,拷貝提交該原始碼。

注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。

注意:主類的名字必須是:Main,否則按無效程式碼處理。

 第七題還真沒有想出什麼好的方法,先把部落格發表了後面再補上吧。

 注:題目文件和源程式已經上傳到了CSDN的下載頁,下載地址在下面評論中。需要的同志可以自行下載。