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

題目一:第幾天

2000年的1月1日,是那一年的第1天押袍。
那么,2000年的5月4日凯肋,是那一年的第幾天谊惭?
注意:需要提交的是一個整數(shù),不要填寫任何多余內(nèi)容侮东。
答案:125天
解法:

新建文本文檔 1.vbs
msgbox dateadd("d",124,"2000-1-1")

1+124=125天

題目二:明碼

漢字的字形存在于字庫中圈盔,即便在今天,16點陣的字庫也仍然使用廣泛苗桂。
16點陣的字庫把每個漢字看成是16x16個像素信息药磺。并把這些信息記錄在字節(jié)中。

一個字節(jié)可以存儲8位信息煤伟,用32個字節(jié)就可以存一個漢字的字形了癌佩。
把每個字節(jié)轉(zhuǎn)為2進(jìn)制表示,1表示墨跡便锨,0表示底色围辙。每行2個字節(jié),
一共16行放案,布局是:

第1字節(jié)姚建,第2字節(jié)
第3字節(jié),第4字節(jié)
....
第31字節(jié), 第32字節(jié)

這道題目是給你一段多個漢字組成的信息吱殉,每個漢字用32個字節(jié)表示掸冤,這里給出了字節(jié)作為有符號整數(shù)的值。

題目的要求隱藏在這些信息中友雳。你的任務(wù)是復(fù)原這些漢字的字形稿湿,從中看出題目的要求,并根據(jù)要求填寫答案押赊。
這段信息是(一共10個漢字):

4 0 4 0 4 0 4 32 -1 -16 4 32 4 32 4 32 4 32 4 32 8 32 8 32 16 34 16 34 32 30 -64 0 
16 64 16 64 34 68 127 126 66 -124 67 4 66 4 66 -124 126 100 66 36 66 4 66 4 66 4 126 4 66 40 0 16 
4 0 4 0 4 0 4 32 -1 -16 4 32 4 32 4 32 4 32 4 32 8 32 8 32 16 34 16 34 32 30 -64 0 
0 -128 64 -128 48 -128 17 8 1 -4 2 8 8 80 16 64 32 64 -32 64 32 -96 32 -96 33 16 34 8 36 14 40 4 
4 0 3 0 1 0 0 4 -1 -2 4 0 4 16 7 -8 4 16 4 16 4 16 8 16 8 16 16 16 32 -96 64 64 
16 64 20 72 62 -4 73 32 5 16 1 0 63 -8 1 0 -1 -2 0 64 0 80 63 -8 8 64 4 64 1 64 0 -128 
0 16 63 -8 1 0 1 0 1 0 1 4 -1 -2 1 0 1 0 1 0 1 0 1 0 1 0 1 0 5 0 2 0 
2 0 2 0 7 -16 8 32 24 64 37 -128 2 -128 12 -128 113 -4 2 8 12 16 18 32 33 -64 1 0 14 0 112 0 
1 0 1 0 1 0 9 32 9 16 17 12 17 4 33 16 65 16 1 32 1 64 0 -128 1 0 2 0 12 0 112 0 
0 0 0 0 7 -16 24 24 48 12 56 12 0 56 0 -32 0 -64 0 -128 0 0 0 0 1 -128 3 -64 1 -128 0 0 

思路:將兩個數(shù)字(16位)為一行轉(zhuǎn)換為二進(jìn)制排列成16*16方陣

方法一:
#include<iostream>
using namespace std;
int main()
{
    int m,n,w[16];
    while(cin>>m>>n)
    {
        for(int i=7;i>=0;i--)//二進(jìn)制從右邊開始數(shù)7~0 
        {   //轉(zhuǎn)換為二進(jìn)制 
            w[i]=m&1;//同1進(jìn)行與操作 
            m>>=1;//右移一位(除2) 
        }
        for(int i=15;i>=8;i--)
        {
            w[i]=n&1;
            n>>=1;
        }
        for(int i=0;i<=15;i++)//正向輸出 
        {
            cout<<w[i]; 
        }
        cout<<endl;
    }
    return 0;   
}
方法二:
#include<iostream>
#include<bitset>
using namespace std;
int main(){
    int n,m;
    while(cin>>n>>m){
        bitset<8> t;//t為二進(jìn)制8位    biset<length> t
        t=n;//將n賦給t饺藤,即將n轉(zhuǎn)化為8位二進(jìn)制 
        cout<<t;//輸出n的8位二進(jìn)制 
        t=m;//將m賦給t,即將n轉(zhuǎn)化為8位二進(jìn)制 
        cout<<t<<endl;//輸出n的8位二進(jìn)制 
    }
    return 0;   
} 

bitset函數(shù)講解

將上方所有信息復(fù)制運行流礁,得到如下圖所示九的九次方等于多少涕俗?

image.png

答案:387420489

思路2:如果你懶得編程,那么可以用Excel來處理神帅,里面有自帶的公式可以把十進(jìn)制轉(zhuǎn)換成二進(jìn)制再姑。首先把上述數(shù)據(jù)復(fù)制到txt里,按照兩個一行排好找御,然后導(dǎo)入Excel询刹,用公式DEC2BIN(num,8)就行了谜嫉,這里的8就是位數(shù),然后我不知道為什么負(fù)數(shù)出來都是10位的凹联,所以我讓他們都靠右,然后把第二列寬度調(diào)小了哆档,讓他們看起來是連在一起的蔽挠。如果你覺得不夠清楚,可以調(diào)成黑底白字(參考自網(wǎng)上)

image
image
image
image
image

題目三:乘積尾零

如下的10行數(shù)據(jù)瓜浸,每行有10個整數(shù)澳淑,請你求出它們的乘積的末尾有多少個零?

5650 4542 3554 473 946 4114 3871 9073 90 4329 
2758 7949 6113 5659 5245 7432 3051 4434 6704 3594 
9937 1173 6866 3397 4759 7557 3070 2287 1453 9899 
1486 5722 3135 1170 4014 5510 5120 729 2880 9019 
2049 698 4582 4346 4427 646 9742 7340 1230 7683 
5693 7015 6887 7381 4172 4341 2909 2027 7355 5649 
6701 6645 1671 5978 2704 9926 295 3125 3878 6785 
2066 4247 4800 1578 6652 4616 1113 6205 3264 2915 
3966 5291 2904 1285 2193 1428 2265 8730 9436 7074 
689 5510 8243 6114 337 4096 8199 7313 3685 211 

思路:0是由2*5得來的插佛,所以計算2和5中的個數(shù)數(shù)少的就是0的個數(shù)了

#include <iostream>  
//#include <cstdio>  
#include<cmath>
//#include<algorithm>
using namespace std;
int main()
{
    int n,c2=0,c5=0;
    for (int i = 0; i < 100; i++)
    {
        cin >> n;
        while (n % 5 == 0)
        {
            n /= 5;
            c5++;
        }
        while (n % 2 == 0)
        {
            n /= 2;
            c2++;
        }
    }
       cout<<c2<<endl<<c5;//cout << min(c2, c5) << endl;
    return 0;
}

答案:31

題目五:快速排序杠巡。

以下代碼可以從數(shù)組a[]中找出第k小的元素。

它使用了類似快速排序中的分治算法雇寇,期望時間復(fù)雜度是O(N)的氢拥。

請仔細(xì)閱讀分析源碼,填寫劃線部分缺失的內(nèi)容锨侯。

#include <stdio.h>

int quick_select(int a[], int l, int r, int k) {
    int p = rand() % (r - l + 1) + l;
    int x = a[p];
    {int t = a[p]; a[p] = a[r]; a[r] = t;}
    int i = l, j = r;
    while(i < j) {
        while(i < j && a[i] < x) i++;
        if(i < j) {
            a[j] = a[i];
            j--;
        }
        while(i < j && a[j] > x) j--;
        if(i < j) {
            a[i] = a[j];
            i++;
        }
    }
    a[i] = x;
    p = i;
    if(i - l + 1 == k) return a[i];
    if(i - l + 1 < k) return quick_select( _____________________________ ); //填空
    else return quick_select(a, l, i - 1, k);
}
    
int main()
{
    int a[] = {1, 4, 2, 8, 5, 7, 23, 58, 16, 27, 55, 13, 26, 24, 12};
    printf("%d\n", quick_select(a, 0, 14, 5));
    return 0;
}


注意:只填寫劃線部分缺少的代碼嫩海,不要抄寫已經(jīng)存在的代碼或符號。

代碼審計

#include <stdio.h>
int quick_select(int a[], int l, int r, int k) {
    int p = rand() % (r - l + 1) + l;//隨機定位一個基準(zhǔn)下標(biāo) 
    int x = a[p];//將基準(zhǔn)下標(biāo)代表的數(shù)字取出 
    /*這里由于已經(jīng)把基準(zhǔn)值存入了x中囚痴,所以可以認(rèn)為a[p]是挖了一個坑叁怪,可以填數(shù)據(jù)*/
    {int t = a[p]; a[p] = a[r]; a[r] = t;}//將挖的坑移至數(shù)組尾端 
    int i = l, j = r;//i作為從前向后檢索的下標(biāo),j作為從后向前檢索的下標(biāo) 
    while(i < j) {//快速排序
        while(i < j && a[i] < x) i++;//如果有值比基準(zhǔn)值小且在基準(zhǔn)值左方那么不變
        if(i < j) {//如果有值比基準(zhǔn)值大且在基準(zhǔn)值左方
            a[j] = a[i];//用這個值把坑填上
            j--;//j下標(biāo)向前移動
        }//此時i指向了那個坑
        while(i < j && a[j] > x) j--;//如果有值比基準(zhǔn)值大且在基準(zhǔn)值右方那么不變
        if(i < j) {//如果有值比基準(zhǔn)值小且在基準(zhǔn)值右方
            a[i] = a[j];//再次把坑填上
            i++;//i下標(biāo)向后移動
        }
    }
    a[i] = x;//把x的值扔回去深滚,此時奕谭,比x小的值都在其左側(cè),比x大的值都在其右側(cè)痴荐。
    p = i;//此時x是第幾個數(shù)血柳,就是第幾小的數(shù)。
    if(i - l + 1 == k) return a[i];
    if(i - l + 1 < k) return quick_select( a, i+1, r, k-(i-l+1) ); //填空
    else return quick_select(a, l, i - 1, k);
}
    
int main()
{
    int a[] = {1, 4, 2, 8, 5, 7, 23, 58, 16, 27, 55, 13, 26, 24, 12};
    printf("%d\n", quick_select(a, 0, 14, 5));
    return 0;
}

答案:a, i+1, r, k-(i-l+1)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蹬昌,一起剝皮案震驚了整個濱河市混驰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌皂贩,老刑警劉巖栖榨,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異明刷,居然都是意外死亡婴栽,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進(jìn)店門辈末,熙熙樓的掌柜王于貴愁眉苦臉地迎上來愚争,“玉大人映皆,你說我怎么就攤上這事『渲Γ” “怎么了捅彻?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長鞍陨。 經(jīng)常有香客問我步淹,道長,這世上最難降的妖魔是什么诚撵? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任缭裆,我火速辦了婚禮,結(jié)果婚禮上寿烟,老公的妹妹穿的比我還像新娘澈驼。我一直安慰自己,他們只是感情好筛武,可當(dāng)我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布缝其。 她就那樣靜靜地躺著,像睡著了一般畅铭。 火紅的嫁衣襯著肌膚如雪氏淑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天硕噩,我揣著相機與錄音假残,去河邊找鬼。 笑死炉擅,一個胖子當(dāng)著我的面吹牛辉懒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谍失,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼眶俩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了快鱼?” 一聲冷哼從身側(cè)響起颠印,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎抹竹,沒想到半個月后线罕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡窃判,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年钞楼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片袄琳。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡询件,死狀恐怖燃乍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情宛琅,我是刑警寧澤刻蟹,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站夯秃,受9級特大地震影響座咆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜仓洼,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望堤舒。 院中可真熱鬧色建,春花似錦、人聲如沸舌缤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽国撵。三九已至陵吸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間介牙,已是汗流浹背壮虫。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留环础,地道東北人囚似。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像线得,于是被迫代替她去往敵國和親饶唤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,747評論 2 361

推薦閱讀更多精彩內(nèi)容