2013年第四屆藍(lán)橋杯C/C++B組省賽

一、 高斯日記

大數(shù)學(xué)家高斯有個好習(xí)慣:無論如何都要記日記。
他的日記有個與眾不同的地方,他從不注明年月日,而是用一個整數(shù)代替,比如:4210
后來人們知道,那個整數(shù)就是日期,它表示那一天是高斯出生后的第幾天。這或許也是個好習(xí)慣,它時時刻刻提醒著主人:日子又過去一天,還有多少時光可以用于浪費呢?
高斯出生于:1777年4月30日。
在高斯發(fā)現(xiàn)的一個重要定理的日記上標(biāo)注著:5343,因此可算出那天是:1791年12月15日。
高斯獲得博士學(xué)位的那天日記上標(biāo)著:8113
請你算出高斯獲得博士學(xué)位的年月日。
提交答案的格式是:yyyy-mm-dd, 例如:1980-03-21

請嚴(yán)格按照格式,通過瀏覽器提交答案。
注意:只提交這個日期,不要寫其它附加內(nèi)容,比如:說明性的文字。

解析:

新建文檔 1.vbs
Msgbox dateadd("d",8112,"1777-04-30")
答案:1799-07-16

二、馬虎的算式

小明是個急性子,上小學(xué)的時候經(jīng)常把老師寫在黑板上的題目抄錯了。
有一次,老師出的題目是:36 x 495 = ?
他卻給抄成了:396 x 45 = ?
但結(jié)果卻很戲劇性,他的答案竟然是對的??!
因為 36 * 495 = 396 * 45 = 17820
類似這樣的巧合情況可能還有很多,比如:27 * 594 = 297 * 54
假設(shè) a b c d e 代表1~9不同的5個數(shù)字(注意是各不相同的數(shù)字,且不含0)
能滿足形如: ab * cde = adb * ce 這樣的算式一共有多少種呢?
請你利用計算機(jī)的優(yōu)勢尋找所有的可能,并回答不同算式的種類數(shù)。
滿足乘法交換律的算式計為不同的種類,所以答案肯定是個偶數(shù)。

答案直接通過瀏覽器提交。
注意:只提交一個表示最終統(tǒng)計種類數(shù)的數(shù)字,不要提交解答過程或其它多余的內(nèi)容。

解析:簡單的枚舉
#include <iostream>
using namespace std;
int main()
{
   int ans=0;
    for (int a=1;a<10;a++)
    {
    for (int b=1;b<10;b++)
       { 
        if (a!=b) 
                for (int c=1;c<10;c++)
               {  
               if((c!=a)&&(c!=b)) 
                         for (int d=1;d<10;d++)
                       { 
                           if((d!=a) && (d!=b) && (d!=c)) 
                                  for (int e=1;e<10;e++)
                                   { 
                                   if ((e!=a)&&(e!=b)&&(e!=c)&&(e!=d))
                                          //  ab * cde = adb * ce 
                                         if ( (10*a+b)*(100*c+10*d+e)==(100*a+10*d+b)*(10*c+e)) 
                                             ans++;
                                    }
                       }
               }
       }
    }
   cout<<ans;
    return 0;
}
答案:142

三、第39級臺階

小明剛剛看完電影《第39級臺階》,離開電影院的時候,他數(shù)了數(shù)禮堂前的臺階數(shù),恰好是39級!
站在臺階前,他突然又想著一個問題:
如果我每一步只能邁上1個或2個臺階。先邁左腳,然后左右交替,最后一步是邁右腳,也就是說一共要走偶數(shù)步。那么,上完39級臺階,有多少種不同的上法呢?
請你利用計算機(jī)的優(yōu)勢,幫助小明尋找答案。

要求提交的是一個整數(shù)。
注意:不要提交解答過程,或其它的輔助說明文字。

解析:此題可用遞歸求解
#include <iostream>
using namespace std; 
int ans; 

void f(int n,int step){//n:剩下的階梯數(shù) step:已走的步數(shù) 
    if(n<0)//錯誤走法 
    return;
    if(n==0&&step%2==0){//階梯數(shù)走完且步數(shù)為偶數(shù) 
        ans++;
    }
    f(n-1,step+1);//一步邁上1個臺階 
    f(n-2,step+1);//一步邁上2個臺階 
}

int main()
{
    f(39,0);
    cout<<ans<<endl;
    return 0;       
}
答案:51167078

五、前綴判斷

如下的代碼判斷 needle_start指向的串是否為haystack_start指向的串的前綴,如不是,則返回NULL。

比如:"abcd1234" 就包含了 "abc" 為前綴

char* prefix(char* haystack_start, char* needle_start)
{
    char* haystack = haystack_start;
    char* needle = needle_start;

    
    while(*haystack && *needle){
        if(______________________________) return NULL;  //填空位置
    }
    
    if(*needle) return NULL;
    
    return haystack_start;
}

請分析代碼邏輯,并推測劃線處的代碼,通過網(wǎng)頁提交。
注意:僅把缺少的代碼作為答案,千萬不要填寫多余的代碼、符號或說明文字??!

解析:
# include <iostream>
using namespace std;
char* prefix(char* haystack_start, char* needle_start)
{
    char* haystack = haystack_start;//母串
    char* needle = needle_start;//前綴

    while(*haystack && *needle){//兩個指針沒有越界
//      if(______________________________)  //填空位置
//移動指針并判斷
        if(*(haystack++) != *(needle++)) return NULL;  //填空位置
    }
    
    if(*needle) return NULL;//neddle比haystack長
    
    return haystack_start;
}

int main()
{
    char * haystack = "abcd1234";  //要判斷的字符串 
    char * needle = "abc";  //前綴 
     cout<<prefix(haystack, needle);
     return 0;
}

答案:*(haystack++) != *(needle++)

六、三部排序

一般的排序有許多經(jīng)典算法,如快速排序、希爾排序等。
但實際應(yīng)用時,經(jīng)常會或多或少有一些特殊的要求。我們沒必要套用那些經(jīng)典算法,可以根據(jù)實際情況建立更好的解法。
比如,對一個整型數(shù)組中的數(shù)字進(jìn)行分類排序:
使得負(fù)數(shù)都靠左端,正數(shù)都靠右端,0在中部。注意問題的特點是:負(fù)數(shù)區(qū)域和正數(shù)區(qū)域內(nèi)并不要求有序??梢岳眠@個特點通過1次線性掃描就結(jié)束戰(zhàn)斗!!
以下的程序?qū)崿F(xiàn)了該目標(biāo)。
其中x指向待排序的整型數(shù)組,len是數(shù)組的長度。

void sort3p(int* x, int len)
{
    int mod = 0;
    int left = 0;
    int right = len-1;
    
    while(mod<=right){
        if(x[mod]<0){
            int t = x[left];
            x[left] = x[mod];
            x[mod] = t;
            left++;
            mod++;
        }
        else if(x[mod]>0){
            int t = x[right];
            x[right] = x[mod];
            x[mod] = t;
            right--;            
        }
        else{
            __________________________;  //填空位置
        }
    }
}

如果給定數(shù)組:
25,18,-2,0,16,-5,33,21,0,19,-16,25,-3,0
則排序后為:
-3,-2,-16,-5,0,0,0,21,19,33,25,16,18,25

請分析代碼邏輯,并推測劃線處的代碼,通過網(wǎng)頁提交
注意:僅把缺少的代碼作為答案,千萬不要填寫多余的代碼、符號或說明文字??!

解析:快速排序的變種
#include <iostream>
using namespace std;
void sort3p(int* x, int len)
{
    int mod = 0;
    int left = 0;
    int right = len-1;
    
    while(mod<=right){
        if(x[mod]<0){
            int t = x[left];
            x[left] = x[mod];
            x[mod] = t;
            left++;
            mod++;
        }
        else if(x[mod]>0){
            int t = x[right];
            x[right] = x[mod];
            x[mod] = t;
            right--;            
        }
        else{//==0 
 //    __________________________;  //填空位置
            mod++; 
        }
    }
}

int main(void)
{
    int x[] = {25,18,-2,0,16,-5,33,21,0,19,-16,25,-3,0};
    sort3p(x, 14);
    for(int i = 0; i < 14; i++) {
       cout<<x[i]<<" ";
    }
    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容