2011藍橋杯試卷答案_第1頁
2011藍橋杯試卷答案_第2頁
2011藍橋杯試卷答案_第3頁
2011藍橋杯試卷答案_第4頁
2011藍橋杯試卷答案_第5頁
已閱讀5頁,還剩21頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1.

代碼填空

(滿分3分)神秘的三位數有這樣一個3位數,組成它的3個數字階乘之和正好等于它本身。即:abc

=

a!

+

b!

+

c!下面的程序用于搜索這樣的3位數。請補全缺失的代碼。int

JC[]

=

{1,1,2,6,24,120,720,5040,40320,362880};int

i;for(i=100;

i<1000;

i++){int

sum

=

0;int

x

=

i;while(____){sum

+=

JC[x%10];x

/=

10;}if(i==sum)

printf("%d\n",

i);}

//預賽NO.1題

#include<stdio.h>

voidmain()

{

intJC[]={1,1,2,6,24,120,720,5040,40320,362880};

inti;

intsum;

intx;

for(i=100;i<1000;i++)

{

sum=0;

x=i;

while(x)

{

sum+=JC[x%10];

x/=10;

}

if(i==sum)

{

printf("%d\n",i);

}

}

}復制代碼2.

代碼填空

(滿分4分)歌賽新規則歌手大賽的評分規則一般是去掉一個最高分,去掉一個最低分,剩下的分數求平均。當評委較少的時候,如果我們只允許去掉一個分數,該如何設計規則呢?有人提出:應該去掉與其余的分數平均值相差最遠的那個分數。即“最離群”的分數。以下的程序用于實現這個功能。其中x存放所有評分,n表示數組中元素的個數。函數返回最“離群”的那個分數值。請補全缺失的代碼。double

score(double

x[],

int

n){int

i,j;double

dif

=

-1;double

bad;for(i=0;

i<n;

i++){double

sum

=

0;for(j=0;

j<n;

j++){if(________)

sum

+=

x[j];}double

t

=

x[i]

-

sum

/

(n-1);if(t<0)

t

=

-t;if(t>dif){dif

=

t;bad

=

x[i];printf("%d,

%f\n",

i,

x[i]);}}

return

bad;}

//預賽NO.2題

#include<stdio.h>

voidmain()

{

doublex[10]={7,8,8,8,8,20,8,8,8,8};

inti,j;

doubledif=-1;

doublebad;

doublesum;

intn=10;

doublet;

for(i=0;i<10;i++)

{

sum=0;

for(j=0;j<n;j++)

{

if(j!=i)sum+=x[j];

}

t=x[i]-sum/(n-1);

if(t<0)t=-t;

if(t>dif)

{

dif=t;

bad=x[i];

printf("%d,%f\n",i,x[i]);

}

}

printf("bad=%lf\n",bad);

}復制代碼3.

代碼填空

(滿分4分)反轉串我們把“cba”稱為“abc”的反轉串。下面的代碼可以把buf中的字符反轉。其中n表示buf中待反轉的串的長度。請補充缺少的代碼。void

reverse_str(char*

buf,

int

n){if(n<2)

return;char

tmp

=

buf[0];buf[0]

=

buf[n-1];buf[n-1]

=

tmp;_______________________________;}

//預賽NO.3題

#include<stdio.h>

#include<string.h>

voidreverse_str(char*buf,intn)

{

chartmp;

if(n<2)return;

tmp=buf[0];

buf[0]=buf[n-1];

buf[n-1]=tmp;

reverse_str(buf+1,n-2);

}

voidmain()

{

chara[10]="zhanghe";

reverse_str(a,strlen(a));

printf("%s\n",a);

}復制代碼4.

代碼填空

(滿分5分)n進制小數將任意十進制正小數分別轉換成2,3,4,5,6,7,8,9進制正小數,小數點后保留8位,并輸出。例如:若十進制小數為0.795,則輸出:十進制正小數

0.795000

轉換成

2

進制數為:

0.11001011十進制正小數

0.795000

轉換成

3

進制數為:

0.21011011十進制正小數

0.795000

轉換成

4

進制數為:

0.30232011十進制正小數

0.795000

轉換成

5

進制數為:

0.34414141十進制正小數

0.795000

轉換成

6

進制數為:

0.44341530十進制正小數

0.795000

轉換成

7

進制數為:

0.53645364十進制正小數

0.795000

轉換成

8

進制數為:

0.62702436十進制正小數

0.795000

轉換成

9

進制數為:

0.71348853以下代碼提供了這個功能。其中,dTestNo表示待轉的十進制小數。iBase表示進制數。請填寫缺失的部分。void

fun(double

dTestNo,

int

iBase){int

iT[8];int

iNo;

printf("十進制正小數

%f

轉換成

%d

進制數為:

",dTestNo,

iBase);

for(iNo=0;iNo<8;iNo++){dTestNo

*=

iBase;iT[iNo]

=

________________;if(___________________)

dTestNo

-=

iT[iNo];}

printf("0.");for(iNo=0;

iNo<8;

iNo++)

printf("%d",

iT[iNo]);printf("\n");}

void

main

(

){double

dTestNo=

0.795;int

iBase;

for(iBase=2;iBase<=9;iBase++)fun(dTestNo,iBase);printf("\n");}//預賽NO.4題

#include<stdio.h>

voidfun(doubledTestNo,intiBase)

{

intiT[8];

intiNo;

printf("十進制正小數%f轉換成%d進制數為:",dTestNo,iBase);

for(iNo=0;iNo<8;iNo++)

{

dTestNo*=iBase;

iT[iNo]=(int)dTestNo;

if(dTestNo)dTestNo-=iT[iNo];

}

printf("0.");

for(iNo=0;iNo<8;iNo++)printf("%d",iT[iNo]);

printf("\n");

}

voidmain()

{

doubledTestNo=0.795;

intiBase;

for(iBase=2;iBase<=9;iBase++)

fun(dTestNo,iBase);

printf("\n");

}復制代碼

5.

代碼填空

(滿分6分)輪換串“abcd”每個字符都向右移位,最右的移動到第一個字符的位置,就變為“dabc”。這稱為對串進行位移=1的輪換。同理,“abcd”變為:“cdab”則稱為位移=2的輪換。下面的代碼實現了對串s進行位移為n的輪換。請補全缺失的代碼。void

shift(char*

s,

int

n){char*

p;char*

q;int

len

=

strlen(s);if(len==0)

return;if(n<=0

||

n>=len)

return;

char*

s2

=

(char*)malloc(_________);p

=

s;q

=

s2

+

n

%

len;while(*p){*q++

=

*p++;if(q-s2>=len){*q

=

___________;q

=

s2;}}strcpy(s,s2);free(s2);}

//預賽NO.5題

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

voidshift(char*s,intn)

{

char*p;

char*q;

intlen=strlen(s);

char*s2;

if(len==0)return;

if(n<=0||n>=len)return;

s2=(char*)malloc(sizeof(char)*(len+1));

p=s;

q=s2+n%len;

while(*p)

{

*q++=*p++;

if(q-s2>=len)

{

*q='\0';

q=s2;

}

}

strcpy(s,s2);

free(s2);

}

voidmain()

{

charstr[10]="zhanghe";

shift(str,2);

printf("%s\n",str);

}復制代碼

6.

代碼填空

(滿分9分)中獎計算某抽獎活動的規則是:每位參與者在紙上寫下一個8位數的號碼。最后通過搖獎的辦法隨機產生一個8位數字。參與者寫下的數字中最多有多少個連續位與開獎號碼中的相同,則稱為中了幾個號。例如:小張寫的數字是:12345678,而開獎號碼是:42347856。則稱小張中了3個號,因為其中最長的相同連續位是:“234”。如果小張寫的是:87654321,則他只中了一個號。下面的代碼根據傳入的參數,返回中了幾個號。其中:a表示被評價的號碼,b表示搖號產生的數字。請填寫缺少的代碼。int

g(int

a,

int

b){char

sa[]="00000000";char

sb[]="00000000";int

n

=

0;int

i,j;

sprintf(sa,"%8d",a);sprintf(sb,"%8d",b);for(i=0;

i<8;

i++){for(j=1;

j<=8-i;

j++){char

t

=

________;sa[i+j]

=

0;if(strstr(sb,

sa+i)){if(j>n)

_________;}sa[i+j]

=

t;}}

return

n;}

//預賽NO.6題

#include<stdio.h>

#include<string.h>

intg(inta,intb)//b是搖號產生的

{

charsa[]="00000000";

charsb[]="00000000";

intn=0;

inti,j;

chart;

sprintf(sa,"%8d",a);

sprintf(sb,"%8d",b);

for(i=0;i<8;i++)

{

for(j=1;j<=8-i;j++)

{

t=sa[i+j];

sa[i+j]=0;

if(strstr(sb,sa+i))

{

if(j>n)n=j;

}

sa[i+j]=t;

}

}

returnn;

}

voidmain()

{

inta=12345678;

intb=42347856;

printf("%d\n",g(a,b));

}復制代碼

7.

代碼填空

(滿分10分)概率問題某個袋子中有紅球m個,白球n個。現在要從中取出x個球。那么紅球數目多于白球的概率是多少呢?下面的代碼解決了這個問題。其中的y表示紅球至少出現的次數。這與前文的問題是等價的。因為如果取30個球,要求紅球數大于白球數,則等價于至少取出16個紅球。請根據僅存的線索,判斷程序邏輯,并補全缺少的代碼。/*

m:

袋中紅球的數目

n:

袋中白球的數目

x:

需要取出的數目

y:

紅球至少出現的次數*/double

pro(int

m,

int

n,

int

x,

int

y){if(y>x)

return

0;if(y==0)

return

1;if(y>m)

return

0;if(x-n>y)

return

1;double

p1

=

_______________________;double

p2

=

_______________________;return

(double)m/(m+n)

*

p1

+

(double)n/(m+n)

*

p2;}//預賽NO.7題

#include<stdio.h>

/*

m:袋中紅球的數目

n:袋中白球的數目

x:需要取出的數目

y:紅球至少出現的次數

*/

doublepro(intm,intn,intx,inty)

{

doublep1;

doublep2;

if(y>x)return0;

if(y==0)return1;

if(y>m)return0;

if(x-n>y)return1;

p1=pro(m-1,n,x-1,y-1);//取紅球

p2=pro(m,n-1,x-1,y);//取白球

return(double)m/(m+n)*p1+(double)n/(m+n)*p2;

}

voidmain()

{

intm,n,x;

printf("請依次輸入紅球個數、白球個數及要取的球的個數:");

scanf("%d%d%d",&m,&n,&x);

printf("%lf\n",pro(m,n,x,x/2+1));

}復制代碼

8.

程序設計(滿分15分)方陣的主對角線之上稱為“上三角”。請你設計一個用于填充n階方陣的上三角區域的程序。填充的規則是:使用1,2,3….的自然數列,從左上角開始,按照順時針方向螺旋填充。例如:當n=3時,輸出:1

2

36

45當n=4時,輸出:1

2

3

49

10

58

67當n=5時,輸出:

1

2

3

4

5

12

13

14

6

11

15

7

10

8

9程序運行時,要求用戶輸入整數n(3~20)程序輸出:方陣的上三角部分。要求格式:每個數據寬度為4,右對齊。

//預賽NO.8題

#include<stdio.h>

#include<stdlib.h>

intm[20][20];//矩陣

intidx=1;//位置編號

intc;//層數

intin;//n的值

doubledn;//n的值(用double型可以計算層數)

voidmain()

{

inti,k;

intp,q;

scanf("%lf",&dn);

c=(int)(dn-0.1)/3+1;

in=(int)dn;

for(i=0,k=in-1;i<c;k-=2,i++)

{

if(i==k)

{

m[i][i]=idx;

break;

}

for(p=i;p<k;p++)

m[i][p]=idx++;

for(p=i,q=k;p<k;p++,q--)

m[p][q]=idx++;

for(p=k;p>i;p--)

m[p][i]=idx++;

}

for(p=0;p<in;p++)

{

for(q=0;q<in-p;q++)

{

printf("%4d",m[p][q]);

}

printf("\n");

}

}復制代碼

9.

程序設計(滿分16分)公司發了某商店的購物券1000元,限定只能購買店中的m種商品。每種商品的價格分別為m1,m2,…,要求程序列出所有的正好能消費完該購物券的不同購物方法。程序輸入:第一行是一個整數m,代表可購買的商品的種類數。接下來是m個整數,每個1行,分別代表這m種商品的單價。程序輸出:第一行是一個整數,表示共有多少種方案第二行開始,每種方案占1行,表示對每種商品購買的數量,中間用空格分隔。例如:輸入:2200300則應輸出:22

25

0輸入:2500800則應輸出:12

0

//預賽NO.9題

#include<stdio.h>

intsln;//方案的個數

intgm;//商品的種類

intprice[1000];//各種商品價錢

intcount[1000];//各種商品的個數

intmethod[1000][1000];//每種解決方案中各商品的個數

intcost;//當前花費

voidoutput()//輸出解決方案

{

inti,j;

printf("%d\n",sln);

for(i=0;i<sln;i++)

{

for(j=0;j<gm;j++)

printf("%3d",method[i][j]);

printf("\n");

}

}

voidfun(intm)

{

inti;

if(cost==1000)

{

for(i=0;i<gm;i++)

method[sln][i]=count[i];

sln++;

return;

}

if(cost>1000||m<0)

return;

//choosem

++count[m];

cost+=price[m];

fun(m);

//notchoosem

--count[m];

cost-=price[m];

fun(m-1);

}

voidmain()

{

intm;//商品的種類

intk;

scanf("%d",&m);

gm=m;

for(k=0;k<m;k++)scanf("%d",&price[k]);

fun(m-1);

output();

}復制代碼

10.

程序設計(滿分28分)一種Playfair密碼變種加密方法如下:首先選擇一個密鑰單詞(稱為pair)(字母不重復,且都為小寫字母),然后與字母表中其他字母一起填入至一個5x5的方陣中,填入方法如下:1.首先按行填入密鑰串。2.緊接其后,按字母序按行填入不在密鑰串中的字母。3.由于方陣中只有25個位置,最后剩下的那個字母則不需變換。如果密鑰為youandme,則該方陣如下:

y

o

u

a

nd

m

e

b

cf

g

h

i

jk

l

p

q

rs

t

v

w

x在加密一對字母時,如am,在方陣中找到以這兩個字母為頂點的矩形(紅色字體):y

o

u

a

nd

m

e

b

cf

g

h

i

jk

l

p

q

rs

t

v

w

x

這對字母的加密字母為該矩形的另一對頂點,如本例中為ob。請設計程序,使用上述方法對輸入串進行加密,并輸出加密后的串。另外有如下規定:1、一對一對取字母,如果最后只剩下一個字母,則不變換,直接放入加密串中;2、如果一對字母中的兩個字母相同,則不變換,直接放入加密串中;3、如果一對字母中有一個字母不在正方形中,則不變換,直接放入加密串中;4、如果字母對出現在方陣中的同一行或同一列,如df或hi,則只需簡單對調這兩個字母,即變換為fd或ih;5、如果在正方形中能夠找到以字母對為頂點的矩形,假如字母對為am,則該矩形的另一對頂點字母中,與a同行的字母應在前面,在上例中應是ob;同樣若待變換的字母對為ta,則變換后的字母對應為wo;6、本程序中輸入串均為小寫字母,并不含標點、空格或其它字符。解密方法與加密相同,即對加密后的字符串再加密,將得到原始串。要求輸入形式如下:從控制臺輸入兩行字符串,第一行為密鑰單詞(長度小于等于25),第二行為待加密字符串(長度小于等于50),兩行字符串末尾都有一個回車換行符,并且兩行字符串均為小寫字母,不含其它字符。在標準輸出上輸出加密后的字符串。例如,若輸入:youandmewelcometohangzhou則表示輸入的密鑰單詞為youandme,形成的正方形如上所示;待加密字符串為welcometohangzhou。在正方形中可以找到以第一對字母we為頂點的矩形,對應另一對頂點字母為vb,因此加密后為vb,同理可找到與字母對lc,et,oh,ho對應的頂點字母對。而字母對om位于上述正方形中的同一列,所以直接以顛倒這兩個字母來加密,即為mo,字母對an同理。字母對gz中的z不在上述正方形中,因此原樣放到加密串中。最后剩一個字母u也原樣輸出。因此輸出的結果為:vbrmmomvugnagzguu

//預賽NO.10題

#include<stdio.h>

#include<string.h>

chara[26]={"abcdefghijklmnopqrstuvwxyz"};

charkey[26];//密鑰

intkey_len;//密鑰長度

intm[5][5];//加密矩陣

charInput[1000];//待加密串

charSecret[1000];//密文

voidInitM()

{

inti,j;

//將key中的字符裝入矩陣

for(i=0;i<key_len;i++)

{

m[i/5][i%5]=key[i];

a[key[i]-97]='*';//表示已經裝入矩陣

}

//將其余字母裝入矩陣

for(j=0;j<26&&i<25;j++)

{

if(a[j]!='*')

{

m[i/5][i%5]=a[j];

a[j]='*';

i++;

}

}

}

intInM(inti)

{

intp,q;

intflag=0;

for(p=0;p<5&&flag!=1;p++)

{

for(q=0;q<5;q++)

{

if(Input[i]==m[p][q])

{

flag=1;

break;

}

}

}

returnflag;

}

introw(inti)

{

intp,q;

for(p=0;p<5;p++)

{

for(q=0;q<5;q++)

{

if(Input[i]==m[p][q])

returnp;

}

}

}

intcolumn(inti)

{

intp,q;

for(p=0;p<5;p++

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論