刷题笔记(一)《王道计算机考研机试指南2》
前言
大一大二天天吃喝睡覺,不喜寫代碼,導致編碼能力薄弱,到了今時今日,無論是讀研還是就業都逃不過上機考試這關,遂開始練習解題能力。
書籍:《計算機考研機試指南(王道第二版》
OJ平臺:??途W:考研復試專區
類型一:暴力計算
這類習題多為機試考試中的簡單題和入門題。大多采用枚舉等方法,由于數據量不大即使復雜度高也能完全跑出來。
奈何本人C語言基礎實在過于將就,有些題目做起來依舊費勁。
1.反序數(THU)
輸入一個數字,輸出它的倒置數:
核心算法:每次循環取原數字的個位再將原數字除以10,revx保存倒置數,初始為0,每次循環*10再加上原數字的個位。
2.佰雞問題(HIT)
注意點:int相除除不盡會喪失精度,可通過數學變形避免分數
#include<iostream>using namespace std;int main(){int n;cin>>n;for(int x=0;x<=100;x++){for(int y=0;y<=100-x;y++){//必須注意,y的范圍受制于x//if(5*x+3*y+(100-x-y)/3<=n){這里/3忽略了小數,所以錯誤,可以使用/3.0,自動轉化double,提高精確度if(5*x*3+3*y*3+(100-x-y)<=n*3){//這樣處理可以不用轉化為doublecout<<"x="<<x<<",y="<<y<<",z="<<100-x-y<<endl;}}}return 0;}3.與7無關(PKU)
4.火雞 old bill(SJTU)
注意判斷沒有的情況,即判斷價格到最后依舊=0
#include<iostream>using namespace std;int main(){int n;int sp=0;int x,y,z;int i,j;while(cin>>n>>x>>y>>z){//循環輸入int xyz=100*x+10*y+z;for(int a=1;a<=9;a++){for(int b=0;b<=9;b++ ){if((a*10000+xyz*10+b)%n==0&&a*10000+xyz*10+b>=sp*n){sp=(a*10000+xyz*10+b)/n;i=a;j=b;}}}if(sp==0)//判斷沒有正確情況cout<<0<<endl;elsecout<<i<<" "<<j<<" "<<sp<<endl;}return 0;}類型二:模擬輸出
這類題目對我而言是個難關,這類題目沒有高深的數學思想,能夠比較純粹的考察編碼的細心和熟練。
1.疊筐
這個問題感覺還是比較奇特的
注意輸出格式:每個之間空一行但最后一個沒空行如何正確處理?
如何構造?規律是什么?
這道題確實花了很長時間,發現從內往外的規律,最里面第0層是字符A,往外交替,第偶數層A第奇數層B,填充四邊的范圍一定要精確,可以找個例子好好算一下范圍。
#include<iostream>using namespace std;int main(){char matrix[80][80];int n;char a,c;bool firstK=true;while(scanf("%d %c %c",&n,&a,&c)!=EOF){if(firstK==true)//要求每個框之間有空行,最后一個框后面沒有--》除了第一個框,其余所有框前面加一個空行firstK=false;elsecout<<endl;//輸出一個框,思路:輸出n*n矩陣最后去掉四個角,發現一層一層交替產生//填充一圈,需要知道用哪個?難點,知道最中心的是a,每層往外就是ca交替//最中心就是0層,最外層就是n/2層//需要知道每圈的長度:第i層邊長:2i+1//從內往外數,偶數層為a,奇數層為c;char tmp;for(int i=0;i<n/2+1;i++){if(i%2==0)tmp=a;elsetmp=c;//填充四邊for(int j=0;j<2*i+1;j++){matrix[n/2-i][n/2-i+j]=tmp;//上邊matrix[n/2-i+j][n/2-i]=tmp;//左邊matrix[n/2-i+j][n/2-i+2*i+1-1]=tmp;//右邊matrix[n/2-i+2*i+1-1][n/2-i+j]=tmp;//下邊}}if(n!=1){matrix[0][0]=' ';matrix[n-1][0]=' ';matrix[0][n-1]=' ';matrix[n-1][n-1]=' ';}for(int x=0;x<n;x++){for(int y=0;y<n;y++){cout<<matrix[x][y];}cout<<endl;}}return 0;}?
2.U型字符串(ZJU)
U型盡量的正:n1n2n3盡量等,可以用n+2/3,多出來的給n2
#include<iostream>using namespace std;int main(){string s;while(cin>>s){int n=s.size();int n1=(n+2)/3;int n2=n+2-2*n1;//要求n1,n2,n3,盡可能相等且n2>=n1,均分三分多出來的給n2即可//控制輸出for(int i=0;i<n1-1;i++){cout<<s[i];for(int x=0;x<n2-2;x++)cout<<" ";//打印n2-2個空格cout<<s[n-1-i]<<endl;}for(int i=n1-1;i<n1+n2-1;i++){//注意范圍// cout<<s[i]<<endl;錯誤cout<<s[i];}cout<<endl;}}類型三:日期類
1.打印日期(華科)
給出年年份m和一年中的第n天,算出第n天是幾月幾號。
輸入包括兩個整數y(1<=y<=3000),n(1<=n<=366)。
可能有多組測試數據,對于每組數據, 按 yyyy-mm-dd的格式將輸入中對應的日期打印出來。
關鍵:判斷閏年,格式輸出
輸入:
2000 3 2000 31 2000 40 2000 60 2000 61 2001 60輸出:
2000-01-03 2000-01-31 2000-02-09 2000-02-29 2000-03-01 2001-03-01 #include<iostream>using namespace std;int main(){int y,day;while((scanf("%d%d",&y,&day))!=EOF){int days[12]={31,28,31,30,31,30,31,31,30,31,30,31};int daysR[12]={31,29,31,30,31,30,31,31,30,31,30,31};bool isR=false;//判斷閏年:4的倍數或400的倍數且不能是100的倍數if(y%4==0&&y%100!=0||y%400==0)isR=true;//求日期int i;int d=0;int dd=0;for( i=0;i<12;i++){if(isR){if(d+daysR[i]>=day){ dd=day-d;break;}d+=daysR[i];}else{if(d+days[i]>=day){dd=day-d;break;}d+=days[i];//當時這里寫反了檢查了半天也沒出來}}//cout<<y<<"-"<<i+1<<"-"<<dd<<endl;//不符合要求,題目要求輸出格式2000-00-00//解決:printf("%4d-%02d-%02d",y,i+1,dd);} }2.日期累加(北理)
設計程序能計算一個日期加上指定天數后的日期
思路:不要鉆牛角重復的判斷今年閏明年后年啥情況。
正確思路是根據現有日期,求出今天是今年第幾天,加上增加的天數,從而判斷年份、月份、日期。
計算出today的天數+number=number,根據這個number判斷年份是否增加(循環),根據這個number也可以推出日期。
#include<iostream> #include <cstring> using namespace std;int daysOfyear(int y){if(y%4==0&&y%100!=0||(y%400==0)){return 366;}else{return 365;}} int isR(int y){bool isr=false;if(y%4==0&&y%100!=0||(y%400==0)){isr=true;}return isr;}int main(){int daysIR[12]={31,28,31,30,31,30,31,31,30,31,30,31};int daysR[12]={31,29,31,30,31,30,31,31,30,31,30,31};int mday[12];int num;cin>>num;while(num--){int y,m,d,number;int y1,m1,d1;//目標年月日值cin>>y>>m>>d>>number;//判斷閏年//總方向:確定年月日//不要把程序思路復雜化//先確定年份//確定今天是該年的第幾天,加上需要增加的天數來判斷年份,之后判斷月份日子if(isR(y)){//mday=daysR;memcpy(mday,daysR,sizeof(daysR));//兩個參數,一個目的一個源}else{//mday=daysIR;memcpy(mday,daysIR,sizeof(daysIR));}for(int i=0;i<m-1;i++)number+=mday[i];number+=d;//cout<<number<<endl;//確定年份while(number>daysOfyear(y)){number=number-daysOfyear(y);y++;}y1=y;//再判斷一下年份是否閏年,選用合適的日數表if(isR(y1)){//mday=daysR;memcpy(mday,daysR,sizeof(daysR));//兩個參數,一個目的一個源}else{//mday=daysIR;memcpy(mday,daysIR,sizeof(daysIR));}//確定月日;根據number確定月日for(m1=0;number>0;m1++){if(number-mday[m1]<=0)break;number-=mday[m1];}m1=m1+1;d1=number;printf("%04d-%02d-%02d\n",y1,m1,d1) ;}return 0;}總結
以上是生活随笔為你收集整理的刷题笔记(一)《王道计算机考研机试指南2》的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android面试详解
- 下一篇: 如何在oracle中查询所有用户表的表名