第三届蓝桥杯预赛c++b组
?
?
?
1.微生物增值
? ? 假設(shè)有兩種微生物 X 和 Y
? ? X出生后每隔3分鐘分裂一次(數(shù)目加倍),Y出生后每隔2分鐘分裂一次(數(shù)目加倍)。
? ? 一個(gè)新出生的X,半分鐘之后吃掉1個(gè)Y,并且,從此開始,每隔1分鐘吃1個(gè)Y。
? ? 現(xiàn)在已知有新出生的 X=10, Y=89,求60分鐘后Y的數(shù)目。
? ? 如果X=10,Y=90 ?呢?
? ? 本題的要求就是寫出這兩種初始條件下,60分鐘后Y的數(shù)目。
? ? 題目的結(jié)果令你震驚嗎?這不是簡(jiǎn)單的數(shù)字游戲!真實(shí)的生物圈有著同樣脆弱的性質(zhì)!也許因?yàn)槟阆麥绲哪侵?Y 就是最終導(dǎo)致 Y 種群滅絕的最后一根稻草!
? ??
? ? 請(qǐng)忍住悲傷,把答案寫在“解答.txt”中,不要寫在這里!
分析:
| ? | ? | ? | ? | ? | ? | ? | ? |
| 時(shí)間t | 0.5 | 1 | 1.5 | 2 | 2.5 | 3 | 3.5 |
| x的數(shù)目 | ? | ? | ? | ? | ? | *2 | ? |
| y的數(shù)目 | -x | ? | -x | *2 | -x | ? | -x |
由表格可以看出,
x的數(shù)目變化:時(shí)間在3s的倍數(shù)時(shí),數(shù)目翻倍。
y的數(shù)目變化:時(shí)間在*.5 s時(shí),數(shù)目減少x;2s的倍數(shù)時(shí),數(shù)目翻倍。
代碼:
?
#include<iostream> #include<stdio.h> using namespace std;int main(){ /*y-x y-x y-x y-xt .5 1 1.5 2 2.5 3 3.5 ...x *2 y -x -x *2 -x -x*/int x,y,t;while(~scanf("%d%d%d",&x,&y,&t)){int i;for(i=1;i<=t*2;i++){// 以半分鐘為一個(gè)單位 if(i%6==0) x=x+x; // x 3分鐘繁殖一次 if(i%4==0) y=y+y; // y 2分鐘繁殖一次 if(i%2!=0) y=y-x; // 0.5,1.5,2.5 分鐘 y減少x if(y<=0) { y=0; break; }// y數(shù)目<=0時(shí),跳出循環(huán) } printf("%d\n",y);}return 0; }2.古堡算式
? ??
? ? 福爾摩斯到某古堡探險(xiǎn),看到門上寫著一個(gè)奇怪的算式:
? ? ABCDE * ? = EDCBA
? ? 他對(duì)華生說(shuō):“ABCDE應(yīng)該代表不同的數(shù)字,問(wèn)號(hào)也代表某個(gè)數(shù)字!”
? ? 華生:“我猜也是!”
? ? 于是,兩人沉默了好久,還是沒(méi)有算出合適的結(jié)果來(lái)。
? ? 請(qǐng)你利用計(jì)算機(jī)的優(yōu)勢(shì),找到破解的答案。
? ? 把 ABCDE 所代表的數(shù)字寫出來(lái)。
? ? 答案寫在“解答.txt”中,不要寫在這里!?
分析:
ABCDE * ? = EDCBA ?=1: ABCDE * ? = ABCDE , 所以 ?>=1 ?=2: ?=3: 12345 12345 50000 * 2 = 100000 ABCED 小于 50000
?
直接枚舉。
代碼:
?
#include<iostream> #include<stdio.h> using namespace std;int main(){ /* ABCDE * ? = EDCBA ?=1: ABCDE * ? = ABCDE , 所以 ?>=1 ?=2: ?=3:12345 12345 50000 * 2 = 100000ABCED 小于 50000 */int i,j,k;int i1,i2,i3,i4,i5;for(i=10234;i<50000;i++){i1=i/10000;i2=(i/1000)%10;i3=(i/100)%10;i4=(i/10)%10;i5=i%10;if(i1==i2||i1==i3||i1==i4||i1==i5||i2==i3||i2==i4||i2==i5||i3==i4||i3==i5||i4==i5) continue; j=i5*10000+i4*1000+i3*100+i2*10+i1;for(k=2;k<10;k++){if(i*k==j&&k!=i1&&k!=i2&&k!=i3&&k!=i4&&k!=i5){printf("%d * %d = %d\n",i,k,j);break;}}}return 0; }/* 答案代碼,不懂 #include<stdio.h> int main(){int k,t1,t;for(k=10234;k<50000;k++){bool flag[10]={0};t=k;t1=0;while(t){if(flag[t%10]) break;flag[t%10]=true;t1=t1*10+t%10;t/=10;}if(t==0&&t1%k==0){printf("%d * %d = %d\n",k,t1/k,t1); } }return 0; } */
3.比酒量
? ? 有一群海盜(不多于20人),在船上比拼酒量。過(guò)程如下:打開一瓶酒,所有在場(chǎng)的人平分喝下,有幾個(gè)人倒下了。再打開一瓶酒平分,又有倒下的,再次重復(fù)...... 直到開了第4瓶酒,坐著的已經(jīng)所剩無(wú)幾,海盜船長(zhǎng)也在其中。當(dāng)?shù)?瓶酒平分喝下后,大家都倒下了。
? ? 等船長(zhǎng)醒來(lái),發(fā)現(xiàn)海盜船擱淺了。他在航海日志中寫到:“......昨天,我正好喝了一瓶.......奉勸大家,開船不喝酒,喝酒別開船......”
? ? 請(qǐng)你根據(jù)這些信息,推斷開始有多少人,每一輪喝下來(lái)還剩多少人。
? ? 如果有多個(gè)可能的答案,請(qǐng)列出所有答案,每個(gè)答案占一行。
? ? 格式是:人數(shù),人數(shù),...
? ? 例如,有一種可能是:20,5,4,2,0
? ? 答案寫在“解答.txt”中,不要寫在這里!
分析:
直接枚舉。
代碼:
?
#include<iostream> #include<stdio.h> using namespace std;int main(){int i,j,k,l;double a1,a2,a3,a4;double sum;for(i=20;i>=4;i--){a1=1.0/i;for(j=i-1;j>=3;j--){a2=1.0/j;for(k=j-1;k>=2;k--){a3=1.0/k;for(l=k-1;l>=1;l--){a4=1.0/l;sum=a1+a2+a3+a4;if(sum-1>=0&&sum-1<0.00000001) printf("%d %d %d %d 0\n",i,j,k,l);}}}}return 0; }
4.奇怪的比賽
? ? 某電視臺(tái)舉辦了低碳生活大獎(jiǎng)賽。題目的計(jì)分規(guī)則相當(dāng)奇怪:
? ? 每位選手需要回答10個(gè)問(wèn)題(其編號(hào)為1到10),越后面越有難度。答對(duì)的,當(dāng)前分?jǐn)?shù)翻倍;答錯(cuò)了則扣掉與題號(hào)相同的分?jǐn)?shù)(選手必須回答問(wèn)題,不回答按錯(cuò)誤處理)。
? ? 每位選手都有一個(gè)起步的分?jǐn)?shù)為10分。
? ? 某獲勝選手最終得分剛好是100分,如果不讓你看比賽過(guò)程,你能推斷出他(她)哪個(gè)題目答對(duì)了,哪個(gè)題目答錯(cuò)了嗎?
? ? 如果把答對(duì)的記為1,答錯(cuò)的記為0,則10個(gè)題目的回答情況可以用僅含有1和0的串來(lái)表示。例如:0010110011 就是可能的情況。
? ? 你的任務(wù)是算出所有可能情況。每個(gè)答案占一行。
? ? 答案寫在“解答.txt”中,不要寫在這里!
分析:
枚舉,遞歸求解。
代碼:
?
?
#include<iostream> #include<stdio.h> using namespace std;void f(char s[],int n,int score){if(n==11){if(score==100) printf("%s\n",s);return;}s[n-1]='0';f(s,n+1,score-n);s[n-1]='1';f(s,n+1,score+score); }int main(){char s[11];s[10]='\0';f(s,1,10);return 0; }
5.轉(zhuǎn)方陣
? ? 對(duì)一個(gè)方陣轉(zhuǎn)置,就是把原來(lái)的行號(hào)變列號(hào),原來(lái)的列號(hào)變行號(hào)
? ? 例如,如下的方陣:
?1 ?2 ?3 ?4
?5 ?6 ?7 ?8
?9 10 11 12
13 14 15 16
? ? 轉(zhuǎn)置后變?yōu)?#xff1a;
?1 ?5 ?9 13
?2 ?6 10 14
?3 ?7 11 15
?4 ?8 12 16
? ? 但,如果是對(duì)該方陣順時(shí)針旋轉(zhuǎn)(不是轉(zhuǎn)置),卻是如下結(jié)果:
13 ?9 ?5 ?1
14 10 ?6 ?2
15 11 ?7 ?3
16 12 ?8 ?4
? ? 下面的代碼實(shí)現(xiàn)的功能就是要把一個(gè)方陣順時(shí)針旋轉(zhuǎn)。
void rotate(int* x, int rank)
{
int* y = (int*)malloc(___________________); ?// 填空
for(int i=0; i<rank * rank; i++)
{
y[_________________________] = x[i]; ?// 填空
}
for(i=0; i<rank*rank; i++)
{
x[i] = y[i];
}
free(y);
}
int main(int argc, char* argv[])
{
int x[4][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
int rank = 4;
rotate(&x[0][0], rank);
for(int i=0; i<rank; i++)
{
for(int j=0; j<rank; j++)
{
printf("%4d", x[i][j]);
}
printf("\n");
}
return 0;
}
請(qǐng)分析代碼邏輯,并推測(cè)劃線處的代碼。
答案寫在 “解答.txt” 文件中
注意:只寫劃線處應(yīng)該填的內(nèi)容,劃線前后的內(nèi)容不要抄寫。
分析:
1.第一個(gè)空好填
2.第二個(gè)空,主要是表示出行和列來(lái)
?
/*0 1 2 3 12 8 4 0 4 5 6 7 13 9 5 18 9 10 11 14 10 6 212 13 14 15 15 11 7 3行:i/4 i%4 列:i%4 3-i/4?
?
代碼:
?
?
#include<iostream> #include<stdio.h> #include<algorithm> using namespace std;/*0 1 2 3 12 8 4 0 4 5 6 7 13 9 5 18 9 10 11 14 10 6 212 13 14 15 15 11 7 3行:i/4 i%4 列:i%4 3-i/4*/ void rotate(int* x, int rank) {int* y = (int*)malloc(rank*rank*sizeof(int)); // 填空f(shuō)or(int i=0; i<rank * rank; i++){y[(i%rank)*rank + rank-1-i/rank] = x[i]; // 填空}for(int i=0; i<rank*rank; i++){x[i] = y[i];}free(y); }int main(int argc, char* argv[]) {int x[4][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};int rank = 4;rotate(&x[0][0], rank);for(int i=0; i<rank; i++){for(int j=0; j<rank; j++){printf("%4d", x[i][j]);}printf("\n");}return 0; }?
6.大數(shù)乘法
? ? 對(duì)于32位字長(zhǎng)的機(jī)器,大約超過(guò)20億,用int類型就無(wú)法表示了,我們可以選擇int64類型,但無(wú)論怎樣擴(kuò)展,固定的整數(shù)類型總是有表達(dá)的極限!如果對(duì)超級(jí)大整數(shù)進(jìn)行精確運(yùn)算呢?一個(gè)簡(jiǎn)單的辦法是:僅僅使用現(xiàn)有類型,但是把大整數(shù)的運(yùn)算化解為若干小整數(shù)的運(yùn)算,即所謂:“分塊法”。
? ? 如圖【1.jpg】表示了分塊乘法的原理??梢园汛髷?shù)分成多段(此處為2段)小數(shù),然后用小數(shù)的多次運(yùn)算組合表示一個(gè)大數(shù)??梢愿鶕?jù)int的承載能力規(guī)定小塊的大小,比如要把int分成2段,則小塊可取10000為上限值。注意,小塊在進(jìn)行縱向累加后,需要進(jìn)行進(jìn)位校正。
? ? 以下代碼示意了分塊乘法的原理(乘數(shù)、被乘數(shù)都分為2段)。
void bigmul(int x, int y, int r[])
{
int base = 10000;
int x2 = x / base;
int x1 = x % base;?
int y2 = y / base;
int y1 = y % base;?
int n1 = x1 * y1;?
int n2 = x1 * y2;
int n3 = x2 * y1;
int n4 = x2 * y2;
r[3] = n1 % base;
r[2] = n1 / base + n2 % base + n3 % base;
r[1] = ____________________________________________; // 填空
r[0] = n4 / base;
r[1] += _______________________; ?// 填空
r[2] = r[2] % base;
r[0] += r[1] / base;
r[1] = r[1] % base;
}
int main(int argc, char* argv[])
{
int x[] = {0,0,0,0};
bigmul(87654321, 12345678, x);
printf("%d%d%d%d\n", x[0],x[1],x[2],x[3]);
return 0;
}
請(qǐng)分析代碼邏輯,并推測(cè)劃線處的代碼。
答案寫在 “解答.txt” 文件中
注意:只寫劃線處應(yīng)該填的內(nèi)容,劃線前后的內(nèi)容不要抄寫。
分析:
直接見代碼。
代碼:
?
#include<iostream> #include<stdio.h> using namespace std;void bigmul(int x, int y, int r[]) {int base = 10000;int x2 = x / base;int x1 = x % base; int y2 = y / base;int y1 = y % base; int n1 = x1 * y1; int n2 = x1 * y2;int n3 = x2 * y1;int n4 = x2 * y2;r[3] = n1 % base;r[2] = n1 / base + n2 % base + n3 % base;r[1] = n2/base+n3/base+n4%base; // 填空r[0] = n4 / base;r[1] += r[2]/base; // 填空r[2] = r[2] % base;r[0] += r[1] / base;r[1] = r[1] % base; }int main(int argc, char* argv[]) {int x[] = {0,0,0,0};bigmul(87654321, 12345678, x);printf("%d%d%d%d\n", x[0],x[1],x[2],x[3]);return 0; }
7.放棋子
? ? 今有 6 x 6 的棋盤格。其中某些格子已經(jīng)預(yù)先放好了棋子。現(xiàn)在要再放上去一些,使得:每行每列都正好有3顆棋子。我們希望推算出所有可能的放法。下面的代碼就實(shí)現(xiàn)了這個(gè)功能。
? ? 初始數(shù)組中,“1”表示放有棋子,“0”表示空白。 ? ?
int N = 0;
bool CheckStoneNum(int x[][6])
{
for(int k=0; k<6; k++)
{
int NumRow = 0;
int NumCol = 0;
for(int i=0; i<6; i++)
{
if(x[k][i]) NumRow++;
if(x[i][k]) NumCol++;
}
if(_____________________) return false; ?// 填空
}
return true;
}
int GetRowStoneNum(int x[][6], int r)
{
int sum = 0;
for(int i=0; i<6; i++)?if(x[r][i]) sum++;
return sum;
}
int GetColStoneNum(int x[][6], int c)
{
int sum = 0;
for(int i=0; i<6; i++)?if(x[i][c]) sum++;
return sum;
}
void show(int x[][6])
{
for(int i=0; i<6; i++)
{
for(int j=0; j<6; j++) printf("%2d", x[i][j]);
printf("\n");
}
printf("\n");
}
void f(int x[][6], int r, int c);
void GoNext(int x[][6], ?int r, ?int c)
{
if(c<6)
_______________________; ? // 填空
else
f(x, r+1, 0);
}
void f(int x[][6], int r, int c)
{
if(r==6)
{
if(CheckStoneNum(x))
{
N++;
show(x);
}
return;
}
if(______________) ?// 已經(jīng)放有了棋子
{
GoNext(x,r,c);
return;
}
int rr = GetRowStoneNum(x,r);
int cc = GetColStoneNum(x,c);
if(cc>=3) ?// 本列已滿
GoNext(x,r,c); ?
else if(rr>=3) ?// 本行已滿
f(x, r+1, 0); ??
else
{
x[r][c] = 1;
GoNext(x,r,c);
x[r][c] = 0;
if(!(3-rr >= 6-c || 3-cc >= 6-r)) ?// 本行或本列嚴(yán)重缺子,則本格不能空著!
GoNext(x,r,c); ?
}
}
int main(int argc, char* argv[])
{
int x[6][6] = {
{1,0,0,0,0,0},
{0,0,1,0,1,0},
{0,0,1,1,0,1},
{0,1,0,0,1,0},
{0,0,0,1,0,0},
{1,0,1,0,0,1}
};
f(x, 0, 0);
printf("%d\n", N);
return 0;
}
請(qǐng)分析代碼邏輯,并推測(cè)劃線處的代碼。
答案寫在 “解答.txt” 文件中
注意:只寫劃線處應(yīng)該填的內(nèi)容,劃線前后的內(nèi)容不要抄寫。
分析:
直接見代碼。
代碼:
?
?
#include<iostream> #include<stdio.h> using namespace std;int N = 0;bool CheckStoneNum(int x[][6]) {for(int k=0; k<6; k++){int NumRow = 0;int NumCol = 0;for(int i=0; i<6; i++){if(x[k][i]) NumRow++;if(x[i][k]) NumCol++;}if(NumRow!=3||NumCol!=3) return false; // 填空}return true; }int GetRowStoneNum(int x[][6], int r) {int sum = 0;for(int i=0; i<6; i++) if(x[r][i]) sum++;return sum; }int GetColStoneNum(int x[][6], int c) {int sum = 0;for(int i=0; i<6; i++) if(x[i][c]) sum++;return sum; }void show(int x[][6]) {for(int i=0; i<6; i++){for(int j=0; j<6; j++) printf("%2d", x[i][j]);printf("\n");}printf("\n"); }void f(int x[][6], int r, int c);void GoNext(int x[][6], int r, int c) {if(c<6)f(x,r,c+1); // 填空elsef(x, r+1, 0); }void f(int x[][6], int r, int c) {if(r==6){if(CheckStoneNum(x)){N++;show(x);}return;}if(x[r][c]) // 已經(jīng)放有了棋子{GoNext(x,r,c);return;}int rr = GetRowStoneNum(x,r);int cc = GetColStoneNum(x,c);if(cc>=3) // 本列已滿GoNext(x,r,c); else if(rr>=3) // 本行已滿f(x, r+1, 0); else{x[r][c] = 1;GoNext(x,r,c);x[r][c] = 0;if(!(3-rr >= 6-c || 3-cc >= 6-r)) // 本行或本列嚴(yán)重缺子,則本格不能空著!GoNext(x,r,c); } }int main(int argc, char* argv[]) {int x[6][6] = {{1,0,0,0,0,0},{0,0,1,0,1,0},{0,0,1,1,0,1},{0,1,0,0,1,0},{0,0,0,1,0,0},{1,0,1,0,0,1}};f(x, 0, 0);printf("%d\n", N);return 0; }
8.密碼發(fā)生器
? ? 在對(duì)銀行賬戶等重要權(quán)限設(shè)置密碼的時(shí)候,我們常常遇到這樣的煩惱:如果為了好記用生日吧,容易被破解,不安全;如果設(shè)置不好記的密碼,又擔(dān)心自己也會(huì)忘記;如果寫在紙上,擔(dān)心紙張被別人發(fā)現(xiàn)或弄丟了...
? ? 這個(gè)程序的任務(wù)就是把一串拼音字母轉(zhuǎn)換為6位數(shù)字(密碼)。我們可以使用任何好記的拼音串(比如名字,王喜明,就寫:wangximing)作為輸入,程序輸出6位數(shù)字。
? ? 變換的過(guò)程如下:
? ? 第一步. 把字符串6個(gè)一組折疊起來(lái),比如wangximing則變?yōu)?#xff1a;
? ? wangxi
? ? ming?
? ? 第二步. 把所有垂直在同一個(gè)位置的字符的ascii碼值相加,得出6個(gè)數(shù)字,如上面的例子,則得出:
? ? 228 202 220 206 120 105
? ? 第三步. 再把每個(gè)數(shù)字“縮位”處理:就是把每個(gè)位的數(shù)字相加,得出的數(shù)字如果不是一位數(shù)字,就再縮位,直到變成一位數(shù)字為止。例如: 228 => 2+2+8=12 => 1+2=3
? ? 上面的數(shù)字縮位后變?yōu)?#xff1a;344836, 這就是程序最終的輸出結(jié)果!
? ? 要求程序從標(biāo)準(zhǔn)輸入接收數(shù)據(jù),在標(biāo)準(zhǔn)輸出上輸出結(jié)果。
? ? 輸入格式為:第一行是一個(gè)整數(shù)n(<100),表示下邊有多少輸入行,接下來(lái)是n行字符串,就是等待變換的字符串。
? ? 輸出格式為:n行變換后的6位密碼。
? ? 例如,輸入:
5
zhangfeng
wangximing
jiujingfazi
woaibeijingtiananmen
haohaoxuexi
? ? 則輸出:
772243
344836
297332
716652
875843
? ? 注意:
? ? 請(qǐng)仔細(xì)調(diào)試!您的程序只有能運(yùn)行出正確結(jié)果的時(shí)候才有機(jī)會(huì)得分!
? ??
? ? 在評(píng)卷時(shí)使用的輸入數(shù)據(jù)與試卷中給出的實(shí)例數(shù)據(jù)可能是不同的。
? ? 請(qǐng)把所有函數(shù)寫在同一個(gè)文件中,調(diào)試好后,存入與【考生文件夾】下對(duì)應(yīng)題號(hào)的“解答.txt”中即可。
? ??
? ? 相關(guān)的工程文件不要拷入。
? ??
? ? 源代碼中不能能使用諸如繪圖、Win32API、中斷調(diào)用、硬件操作或與操作系統(tǒng)相關(guān)的API。
? ??
? ? 允許使用STL類庫(kù),但不能使用MFC或ATL等非ANSI c++標(biāo)準(zhǔn)的類庫(kù)。例如,不能使用CString類型(屬于MFC類庫(kù))。
分析:
直來(lái)直去的題,直接求。
代碼:
?
#include<iostream> #include<stdio.h> #include<cstring> using namespace std;int g(int k){int sum=0;while(k){sum=sum+k%10;k=k/10;}if(sum<10) return sum;return g(sum); }void f(char s[],char x[]){int i,j,k,slen;slen=strlen(s);for(i=0;i<6;i++){k=0;for(j=i;j<slen;j=j+6){k=k+s[j];}x[i]=g(k)+'0'; }x[6]='\n'; }int main(){int n,xlen=0;char s[100];char x[10000];scanf("%d",&n);while(n--){scanf("%s",s);f(s,x+xlen);xlen=xlen+7;} x[xlen-1]='\0';printf("%s\n",x);return 0; }
9.奪冠概率
? ? 足球比賽具有一定程度的偶然性,弱隊(duì)也有戰(zhàn)勝?gòu)?qiáng)隊(duì)的可能。
? ? 假設(shè)有甲、乙、丙、丁四個(gè)球隊(duì)。根據(jù)他們過(guò)去比賽的成績(jī),得出每個(gè)隊(duì)與另一個(gè)隊(duì)對(duì)陣時(shí)取勝的概率表:
? ? 甲 ?乙 ?丙 ?丁 ??
甲 ? - ?0.1 0.3 0.5
乙 0.9 ?- ? 0.7 0.4?
丙 0.7 ?0.3 - ? 0.2
丁 0.5 ?0.6 0.8 -
? ? 數(shù)據(jù)含義:甲對(duì)乙的取勝概率為0.1,丙對(duì)乙的勝率為0.3,...
? ? 現(xiàn)在要舉行一次錦標(biāo)賽。雙方抽簽,分兩個(gè)組比,獲勝的兩個(gè)隊(duì)再爭(zhēng)奪冠軍。(參見【1.jpg】)
? ? 請(qǐng)你進(jìn)行10萬(wàn)次模擬,計(jì)算出甲隊(duì)奪冠的概率。
? ? 注意:
? ? 請(qǐng)仔細(xì)調(diào)試!您的程序只有能運(yùn)行出正確結(jié)果的時(shí)候才有機(jī)會(huì)得分!
? ??
? ? 在評(píng)卷時(shí)使用的輸入數(shù)據(jù)與試卷中給出的實(shí)例數(shù)據(jù)可能是不同的。
? ? 請(qǐng)把所有函數(shù)寫在同一個(gè)文件中,調(diào)試好后,存入與【考生文件夾】下對(duì)應(yīng)題號(hào)的“解答.txt”中即可。
? ??
? ? 相關(guān)的工程文件不要拷入。
? ??
? ? 源代碼中不能能使用諸如繪圖、Win32API、中斷調(diào)用、硬件操作或與操作系統(tǒng)相關(guān)的API。
? ??
? ? 允許使用STL類庫(kù),但不能使用MFC或ATL等非ANSI c++標(biāo)準(zhǔn)的類庫(kù)。例如,不能使用CString類型(屬于MFC類庫(kù))。
分析:
直接模擬即可,注意rand()函數(shù)的使用,另外還有srand()函數(shù)。
另外就是括號(hào)內(nèi)的概率比較時(shí)要小于,而不是小于等于,因?yàn)楫a(chǎn)生的隨機(jī)數(shù)是0~9,相比1~10,小了1,所以用小于。
代碼:
?
?
#include<iostream> #include<stdio.h> #include<stdlib.h>//rand()頭文件 #include<time.h> // time()頭文件 using namespace std;int main(){int gl[4][4]={{0,1,3,5},{9,0,7,4},{7,3,0,2},{5,6,8,0}}; int a,a1,b,b1;int i;int sum=0;srand(time(NULL));for(i=0;i<100000;i++){a1=rand()%3+1;//a的對(duì)手 if(rand()%10<gl[0][a1]){//首輪a勝 。此處比較用小于。下同switch(a1){case 1: b=2;b1=3;break;case 2: b=1;b1=3;break;default: b=1;b1=2;}if(rand()%10<gl[b][b1]){//首輪b勝a1=b; }else a1=b1;//首輪b1勝if(rand()%10<gl[0][a1]){//次輪a勝sum++; } }}printf("%f\n",sum*1.0/100000);return 0; }?
10.取球游戲
? ??
? ? 今盒子里有n個(gè)小球,A、B兩人輪流從盒中取球,每個(gè)人都可以看到另一個(gè)人取了多少個(gè),也可以看到盒中還剩下多少個(gè),并且兩人都很聰明,不會(huì)做出錯(cuò)誤的判斷。
? ? 我們約定:
? ??
? ? 每個(gè)人從盒子中取出的球的數(shù)目必須是:1,3,7或者8個(gè)。
? ? 輪到某一方取球時(shí)不能棄權(quán)!
? ? A先取球,然后雙方交替取球,直到取完。
? ? 被迫拿到最后一個(gè)球的一方為負(fù)方(輸方)
? ??
? ? 請(qǐng)編程確定出在雙方都不判斷失誤的情況下,對(duì)于特定的初始球數(shù),A是否能贏?
? ? 程序運(yùn)行時(shí),從標(biāo)準(zhǔn)輸入獲得數(shù)據(jù),其格式如下:
? ? 先是一個(gè)整數(shù)n(n<100),表示接下來(lái)有n個(gè)整數(shù)。然后是n個(gè)整數(shù),每個(gè)占一行(整數(shù)<10000),表示初始球數(shù)。
? ? 程序則輸出n行,表示A的輸贏情況(輸為0,贏為1)。
? ? 例如,用戶輸入:
4
1
2
10
18
? ? 則程序應(yīng)該輸出:
0
1
1
0
? ? 注意:
? ? 請(qǐng)仔細(xì)調(diào)試!您的程序只有能運(yùn)行出正確結(jié)果的時(shí)候才有機(jī)會(huì)得分!
? ??
? ? 在評(píng)卷時(shí)使用的輸入數(shù)據(jù)與試卷中給出的實(shí)例數(shù)據(jù)可能是不同的。
? ? 請(qǐng)把所有函數(shù)寫在同一個(gè)文件中,調(diào)試好后,存入與【考生文件夾】下對(duì)應(yīng)題號(hào)的“解答.txt”中即可。
? ??
? ? 相關(guān)的工程文件不要拷入。
? ??
? ? 源代碼中不能能使用諸如繪圖、Win32API、中斷調(diào)用、硬件操作或與操作系統(tǒng)相關(guān)的API。
? ??
? ? 允許使用STL類庫(kù),但不能使用MFC或ATL等非ANSI c++標(biāo)準(zhǔn)的類庫(kù)。例如,不能使用CString類型(屬于MFC類庫(kù))。
分析:
還不會(huì),,
代碼:
?
?
//以下為答案代碼 #include<stdio.h> int main(){ int a[100],n,max; int b[]={1,3,7,8}; bool flag[10001]={0}; int i,j; max = 0; scanf("%d",&n); for(i=0;i<n;i++){ scanf("%d",a+i); if(a[i]>max) max = a[i]; }for(i=2;i<=max;i++){for(j=0 ; j<4 && b[j]<i ; j++ ){if(flag[i-b[j]]==0){flag[i] = 1;break;}} } for(i=0;i<n;i++) printf("%d\n",flag[a[i]]); return 0; }?
轉(zhuǎn)載于:https://www.cnblogs.com/bofengyu/p/4477366.html
總結(jié)
以上是生活随笔為你收集整理的第三届蓝桥杯预赛c++b组的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: (021) Linux之正则表达式
- 下一篇: SpringMVC中JSP取不到Mode