【分析】與正常書本的標頁碼方式不同,這本武功秘籍的標頁碼方式是 1 23 45 67 89 1011 1213……(兩數字挨著說明這兩個頁碼在書的同一頁),可以筆算模擬求解,也可編程。
源代碼:
#include <stdio.h>int main(){ int start,end; //起始頁碼與終止頁碼 int i,count; //count記錄所需紙張數 while(scanf("%d %d",&start,&end)!=EOF) { count=1; //count賦初值1,表示起始頁碼所在頁為第1頁 for(i=start+1;i<=end;i++) //遇到偶數頁碼,紙張數+1 { if(i%2==0) count++; } PRintf("%d/n",count); } return 0;}程序截圖:
【答案】7
2. (C組T2 4')等額本金 小明從銀行貸款3萬元。約定分24個月,以等額本金方式還款。 這種還款方式就是把貸款額度等分到24個月。每個月除了要還固定的本金外,還要還貸款余額在一個月中產生的利息。 假設月利率是:0.005,即:千分之五。那么, 第一個月,小明要還本金 1250, 還要還利息:30000 * 0.005,總計 1400.00 第二個月,本金仍然要還 1250, 但利息為:(30000-1250) * 0.005 總計 1393.75 請問:小明在第15個月,應該還款多少(本金和利息的總和)? 請把答案金額四舍五入后,保留兩位小數。注意:32.5,一定要寫為:32.50 通過瀏覽器提交答案,這是一個含有小數點和兩位小數的浮點數字。不要寫多余內容(例如:多寫了“元”或添加說明文字)
【分析】推出公式直接求解
源代碼:
#include <stdio.h>int main(){ int i,n; //n-第n個月 double money=1250,sum; while(scanf("%d",&n)!=EOF) { sum=money+(30000-(n-1)*money)*0.005; printf("%.2lf/n",sum); } return 0;}程序截圖:
【答案】1312.50
3. (C組T3 6')猜字母 把abcd...s共19個字母組成的序列重復拼接106次,得到長度為2014的串。 接下來刪除第1個字母(即開頭的字母a),以及第3個,第5個等所有奇數位置的字母。 得到的新串再進行刪除奇數位置字母的動作。如此下去,最后只剩下一個字母,請寫出該字母。 答案是一個小寫字母,請通過瀏覽器提交答案。不要填寫任何多余的內容。
【分析】串操作
源代碼:
#include <stdio.h>#include <string.h>#define maxlen 2015int main(){ int i; int j=0,k,time=0; //time記錄拼接次數 char str[maxlen]; while(time<106) //j記錄"a~s"串拼接106次后的字符串的長度及其后續變化過程 { for(i=0;i<19;i++) str[j++]='a'+i; time++; } str[j]='/0'; //printf("%d/n",j); //(測試用)輸出拼接106次后的串 //printf("%s/n",str); while(j!=1) //串長不為1時,取串中所有偶數位置的字母 { k=0; for(i=0;i<j;i++) { if(i%2!=0) str[k++]=str[i]; } str[k]='/0'; j=k; //把新的串長k賦值給j,繼續循環,直到串長為1時結束 //printf("%d/n",j); //(測試用)輸出每一步刪除操作后的串 //printf("%s/n",str); } printf("%s/n",str); //輸出最后剩下的一個字母 return 0;}程序截圖:
【答案】q
另:參考自csdn,補充一種解法:
#include <iostream>using namespace std;int main(){ string s="abcdefghijklmnopqrs"; string ss; for(int i=0;i<106;i++){ ss+=s; //拼接106次 } while(ss.size()>1){ //判斷循環結束 for(int i=0;i<ss.size();i++){ ss.replace(i,1,""); //replace()函數 的使用 } } cout<<ss; return 0;}/*知識點 replace()函數: 用str中的num個字符替換本字符串中的字符,從index開始 用str中的num2個字符(從index2開始)替換本字符串中的字符,從index1開始,最多num1個字符 用str中的num個字符(從index開始)替換本字符串中的字符 用str中的num2個字符(從index2開始)替換本字符串中的字符,從index1開始,num1個字符 用num2個ch字符替換本字符串中的字符,從index開始 用str中的字符替換本字符串中的字符,迭代器start和end指示范圍 用str中的num個字符替換本字符串中的內容,迭代器start和end指示范圍, 用num個ch字符替換本字符串中的內容,迭代器start和end指示范圍. 例如,以下代碼顯示字符串"They say he carved it himself...find your soul-mate, Homer." string s = "They say he carved it himself...from a BIGGER spoon"; string s2 = "find your soul-mate, Homer."; s.replace( 32, s2.length(), s2 ); cout << s << endl; */4. (C組T4 4')大衍數列中國古代文獻中,曾記載過“大衍數列”, 主要用于解釋中國傳統文化中的太極衍生原理。 它的前幾項是:0、2、4、8、12、18、24、32、40、50 ... 其規律是:對偶數項,是序號平方再除2,奇數項,是序號平方減1再除2。 以下的代碼打印出了大衍數列的前 100 項。int main(){int i;for(i=1; i<100; i++){if(__________________) //填空printf("%d ", i*i/2);elseprintf("%d ", (i*i-1)/2);}printf("/n");} 請填寫劃線部分缺失的代碼。通過瀏覽器提交答案。注意:不要填寫題面已有的內容,也不要填寫任何說明、解釋文字。
填空后代碼:
#include <stdio.h>int main(){ int i; for(i=1; i<100; i++) { if(i%2==0) //填空位置 根據序號是奇數還是偶數判斷 printf("%d ", i*i/2); else printf("%d ", (i*i-1)/2); } printf("/n");}程序截圖:
5. (C組T6 11')神奇算式 由4個不同的數字,組成的一個乘法算式,它們的乘積仍然由這4個數字組成。 比如: 210 x 6 = 1260 8 x 473 = 378427 x 81 = 2187 都符合要求。 如果滿足乘法交換律的算式算作同一種情況,那么,包含上邊已列出的3種情況,一共有多少種滿足要求的算式。 請填寫該數字,通過瀏覽器提交答案,不要填寫多余內容(例如:列出所有算式)。
【分析】4層循環+枚舉+暴力求解
源代碼:
#include <stdio.h>int Repeat(int a[],int n) //判斷等號左側用"*"隔開的四位數是否有重復{ int i,j; int flag=1; for(i=0;i<n;i++) { for(j=i+1;j<n;j++) { if(a[i]==a[j]) { flag=0; break; } } } return flag;}int Judge(int a[],int b[],int n) //判斷等號左右兩側的四位數是否相等,且沒有重復{ int i,j; int flag=0; for(i=0;i<n;i++) { for(j=0;j<n;j++) { if(a[i]==b[j]) { flag++; break; } } } if(flag==4) return 1; else return 0;}int main(){ int a[4],b[4]; //4位數 int count=0,result,result2,result3,t; //count-滿足要求的算式種數 int i; for(a[0]=1;a[0]<=9;a[0]++) //1位*3位 "a*bcd",其中a.b不能為0 { for(a[1]=1;a[1]<=9;a[1]++) { for(a[2]=0;a[2]<=9;a[2]++) { for(a[3]=0;a[3]<=9;a[3]++) { result=a[0]*(a[1]*100+a[2]*10+a[3]); t=result; i=0; while(t) //這里要特別注意結果result是四位數,且數字都是等號左側的4個數 { b[i++]=t%10; t/=10; } if(Judge(a,b,4) && Repeat(a,4) && i==4) //因此這里要加一步i==4的判斷,下同 { count++; printf("%d*%d%d%d=%d/n",a[0],a[1],a[2],a[3],result); } } } } } for(a[0]=1;a[0]<=9;a[0]++) //2位*2位 "ab*cd",其中a.c不能為0 { for(a[1]=0;a[1]<=9;a[1]++) { for(a[2]=1;a[2]<=9;a[2]++) { for(a[3]=0;a[3]<=9;a[3]++) { result2=(a[0]*10+a[1])*(a[2]*10+a[3]); t=result2; i=0; while(t) { b[i++]=t%10; t/=10; } if(Judge(a,b,4) && Repeat(a,4) && i==4) { count++; printf("%d%d*%d%d=%d/n",a[0],a[1],a[2],a[3],result2); } } } } } for(a[0]=1;a[0]<=9;a[0]++) //3位*1位 "abc*d",其中a.d不能為0 { for(a[1]=0;a[1]<=9;a[1]++) { for(a[2]=0;a[2]<=9;a[2]++) { for(a[3]=1;a[3]<=9;a[3]++) { result3=(a[0]*100+a[1]*10+a[2])*(a[3]); t=result3; i=0; while(t) { b[i++]=t%10; t/=10; } if(Judge(a,b,4) && Repeat(a,4) && i==4) { count++; printf("%d%d%d*%d=%d/n",a[0],a[1],a[2],a[3],result3); } } } } } printf("count=%d/n",count/2); //去除因乘法交換律產生的算式 return 0;}程序截圖:
【答案】12
※6. (C組T7 12')繩圈 今有 100 根繩子,當然會有 200 個繩頭。 如果任意取繩頭兩兩配對,把所有繩頭都打結連接起來。最后會形成若干個繩圈(不考慮是否套在一起)。 我們的問題是:請計算最后將形成多少個繩圈的概率最大? 注意:結果是一個整數,請通過瀏覽器提交該數字。不要填寫多余的內容。
【分析】動態規劃
參考源代碼:
#include<iostream>#define N 100using namespace std;double dp[N+1][N+1] = {0}; int main(){ dp[1][1] = 1; for(int i=2;i<=N;i++){ dp[i][1] = dp[i-1][1] * (2*i-2)/(2*i-1); dp[i][i] = dp[i-1][i-1] / (2*i-1); } for(int i=3;i<=N;i++){ for(int j=2;j<i;j++){ dp[i][j] = dp[i-1][j-1]/(2*i-1) + dp[i-1][j] * (2*i-2) / (2*i-1); } } int index = 0; double maxR = 0; for(int i=1;i<=N;i++){ if(dp[N][i]>maxR){ index = i; maxR = dp[N][i]; } } cout<<index<<endl; return 0;}7. (A組T1 2')猜年齡
小明帶兩個妹妹參加元宵燈會。別人問她們多大了,她們調皮地說:“我們倆的年齡之積是年齡之和的6倍”。小明又補充說:“她們可不是雙胞胎,年齡差肯定也不超過8歲啊?!?nbsp; 請你寫出:小明的較小的妹妹的年齡。 注意: 只寫一個人的年齡數字,請通過瀏覽器提交答案。不要書寫任何多余的內容。
【分析】循環+枚舉
源代碼:
#include <stdio.h>int main(){ int a,b; //小/大妹妹年齡 for(a=1;a<=100;a++) { for(b=1;b<=100;b++) { if(a<b) { if((a*b==6*(a+b)) && (b-a)<=8) printf("%d %d/n",a,b); } } } return 0;}程序截圖:
【答案】10
※8. (A組T5 11')錦標賽 如果要在n個數據中挑選出第一大和第二大的數據(要求輸出數據所在位置和值),使用什么方法比較的次數最少?我們可以從體育錦標賽中受到啟發。 如圖【1.png】所示,8個選手的錦標賽,先兩兩捉對比拼,淘汰一半。優勝者再兩兩比拼...直到決出第一名。 第一名輸出后,只要對黃色標示的位置重新比賽即可。 下面的代碼實現了這個算法(假設數據中沒有相同值)。 代碼中需要用一個數組來表示圖中的樹(注意,這是個滿二叉樹,不足需要補齊)。它不是存儲數據本身,而是存儲了數據的下標。 第一個數據輸出后,它所在的位置被標識為-1//重新決出k號位置,v為已輸出值 void pk(int* a, int* b, int n, int k, int v){int k1 = k*2 + 1;int k2 = k1 + 1;if(k1>=n || k2>=n){b[k] = -1;return;}if(b[k1]==v) pk(a,b,n,k1,v);elsepk(a,b,n,k2,v);//重新比較if(b[k1]<0){if(b[k2]>=0)b[k] = b[k2]; elseb[k] = -1;return;}if(b[k2]<0){if(b[k1]>=0)b[k] = b[k1]; elseb[k] = -1;return;}if(______________________) //填空b[k] = b[k1];elseb[k] = b[k2];}//對a中數據,輸出最大,次大元素位置和值 void f(int* a, int len){int n = 1;while(n<len) n *= 2;int* b = (int*)malloc(sizeof(int*) * (2*n-1));int i;for(i=0; i<n; i++){ if(i<len) b[n-1+i] = i;elseb[n-1+i] = -1;}//從最后一個向前處理for(i=2*n-1-1; i>0; i-=2){if(b[i]<0){if(b[i-1]>=0)b[(i-1)/2] = b[i-1]; elseb[(i-1)/2] = -1;}else{if(a[b[i]]>a[b[i-1]])b[(i-1)/2] = b[i];elseb[(i-1)/2] = b[i-1];}}//輸出樹根printf("%d : %d/n", b[0], a[b[0]]);//值等于根元素的需要重新pkpk(a,b,2*n-1,0,b[0]);//再次輸出樹根printf("%d : %d/n", b[0], a[b[0]]);free(b);}int main(){int a[] = {54,55,18,16,122,17,30,9,58};f(a,9); } 請仔細分析流程,填寫缺失的代碼。 通過瀏覽器提交答案,只填寫缺失的代碼,不要填寫已有代碼或其它說明語句等。
圖:
【分析】二叉樹的順序存儲結構、遞歸思想
填空后代碼:
#include <stdio.h>#include <stdlib.h>void pk(int* a, int* b, int n, int k, int v){ int k1 = k*2 + 1; int k2 = k1 + 1; if(k1>=n || k2>=n) { b[k] = -1; return; } if(b[k1]==v) pk(a,b,n,k1,v); else pk(a,b,n,k2,v); //重新比較 if(b[k1]<0) { if(b[k2]>=0) b[k] = b[k2]; else b[k] = -1; return; } if(b[k2]<0) { if(b[k1]>=0) b[k] = b[k1]; else b[k] = -1; return; } if(a[b[k1]]>a[b[k2]]) //填空 b[k] = b[k1]; else b[k] = b[k2];}//對a中數據,輸出最大,次大元素位置和值 void f(int* a, int len){ int n = 1; while(n<len) n *= 2; int* b = (int*)malloc(sizeof(int*) * (2*n-1)); int i; for(i=0; i<n; i++) { if(i<len) b[n-1+i] = i; else b[n-1+i] = -1; } //從最后一個向前處理 for(i=2*n-1-1; i>0; i-=2) { if(b[i]<0) { if(b[i-1]>=0) b[(i-1)/2] = b[i-1]; else b[(i-1)/2] = -1; } else { if(a[b[i]]>a[b[i-1]]) b[(i-1)/2] = b[i]; else b[(i-1)/2] = b[i-1]; } } /*for(i=0;i<2*n-1;i++) //測試用 printf("%d ",b[i]); printf("/n");*/ //輸出樹根 printf("%d : %d/n", b[0], a[b[0]]); //值等于根元素的需要重新pk pk(a,b,2*n-1,0,b[0]); //再次輸出樹根 printf("%d : %d/n", b[0], a[b[0]]); free(b);}int main(){ int a[] = {54,55,18,16,122,17,30,9,58}; f(a,9); }程序截圖:
【答案】a[b[k1]]>a[b[k2]
9. (A組T6 12')撲克序列
A A 2 2 3 3 4 4, 一共4對撲克牌。請你把它們排成一行。 要求:兩個A中間有1張牌,兩個2之間有2張牌,兩個3之間有3張牌,兩個4之間有4張牌。 請填寫出所有符合要求的排列中,字典序最小的那個。 例如:22AA3344 比 A2A23344 字典序小。當然,它們都不是滿足要求的答案。 請通過瀏覽器提交答案?!癆”一定不要用小寫字母a,也不要用“1”代替。字符間一定不要留空格。
【分析】八重循環枚舉八張牌,暴力求解。可以發現,符合條件的序列有2個,但是要注意,輸出字典序最小的。
源代碼:
#include <stdio.h>#include <string.h>int strnum(char str[],char ch,int len){ int i; int count=0; for(i=0;i<len;i++) { if(str[i]==ch) count++; } if(count==2) return 1; else return 0;}int main(){ char str[9]; int i,j,a[8]; int count=0; for(str[0]='1';str[0]<='4';str[0]++) { for(str[1]='1';str[1]<='4';str[1]++) { for(str[2]='1';str[2]<='4';str[2]++) { for(str[3]='1';str[3]<='4';str[3]++) { for(str[4]='1';str[4]<='4';str[4]++) { for(str[5]='1';str[5]<='4';str[5]++) { for(str[6]='1';str[6]<='4';str[6]++) { for(str[7]='1';str[7]<='4';str[7]++) { str[8]='/0'; if(strnum(str,'1',8)==1 && strnum(str,'2',8)==1 && strnum(str,'3',8)==1 && strnum(str,'4',8)==1) { j=0; for(i=0;i<8;i++) { if(str[i]=='1') a[j++]=i; } for(i=0;i<8;i++) { if(str[i]=='2') a[j++]=i; } for(i=0;i<8;i++) { if(str[i]=='3') a[j++]=i; } for(i=0;i<8;i++) { if(str[i]=='4') a[j++]=i; } if(a[1]-a[0]==2 && a[3]-a[2]==3 && a[5]-a[4]==4 && a[7]-a[6]==5) { printf("%s/n",str); count++; } } } } } } } } } } printf("count=%d/n",count); return 0;}程序截圖:
【答案】2342A3A4
新聞熱點
疑難解答
圖片精選