刷题日志1.0
@Welcome To Quinn’s Energy Station
本日志習(xí)題均來自codeup.cn及patest.cn
2021年01月10日 ?
一、簡單模擬
PAT B1011.A+B和C
題目描述:
給定區(qū)間 [?2?31,2?31] 內(nèi)的 3 個整數(shù) A、B 和 C,請判斷 A+B 是否大于 C。
輸入格式:
輸入第 1 行給出正整數(shù) T (≤10),是測試用例的個數(shù)。隨后給出 T 組測試用例,每組占一行,順序給出 A、B 和 C。整數(shù)間以空格分隔。
輸出格式:
對每組測試用例,在一行中輸出 Case #X: true 如果 A+B>C,否則輸出 Case #X: false,其中 X 是測試用例的編號(從 1 開始)。
輸入樣例:
輸出樣例:
Case #1: false Case #2: true Case #3: true Case #4: false思路:
輸入T(組數(shù)),step表示當(dāng)前是第幾組數(shù)據(jù),初值為1。對于每組數(shù)據(jù),判斷A+B是否大于C。題目怎么說就怎么寫!
【Notes】
1、程序?qū)崿F(xiàn)執(zhí)行n次循環(huán),除了for之外,更簡單的寫法是while(n–)。注意!如果寫成while(–n)就是循環(huán)n-1次,而不是n次。
2、題目給出T的范圍超出了int型的范圍([-263,263-1])啊啊啊啊煩死了要 次方為什么打不出來!另外,兩個int型的變量相加,結(jié)果是可能超過int型的。所以要A、B、C定義為 long long 型,輸入輸出格式是%lld。
【W(wǎng)orning】
這塊我提交了好幾次都是格式錯誤,最后發(fā)現(xiàn)題目中的輸出用例冒號后是有空格的,所以之后大家把題目中的case語句直接粘到代碼中去就好啦。
代碼示例如下:
#include<stdio.h> int main(){int T,step=1; scanf("%d",&T); //輸入組數(shù)while(T--){ //循環(huán)T次,T組數(shù)據(jù)long long a,b,c;scanf("%lld%lld%lld",&a,&b,&c);if(a+b>c){printf("Case #%d: true\n",step++);}else{printf("Case #%d: false\n",step++);}}return 0; }PAT B1016.部分A+B
題目描述:
輸入格式:
輸出格式:
輸入樣例 1:
輸出樣例 1:
399輸入樣例 2:
3862767 1 13530293 8輸出樣例 2:
0思路:
輸入A、DA、B、DB,我們可以利用取余枚舉A中的每一位,若該位等于DA,則令PA=PA*10+DA,PB邏輯相同。
代碼示例如下:
#include<stdio.h> int main(){long long a,b,da,db;scanf("%lld%lld%lld%lld",&a,&da,&b,&db);long long pa=0,pb=0;while(a!=0){if(a%10==da) pa=pa*10+da;a=a/10;}while(b!=0){if(b%10==db) pb=pb*10+db;b=b/10;}printf("%lld\n",pa+pb);return 0; }PAT B1026.程序運(yùn)行時間
題目描述: 要獲得一個C語言程序的運(yùn)行時間,常用的方法是調(diào)用頭文件 time.h,其中提供了 clock() 函數(shù),可以捕捉從程序開始運(yùn)行到 clock() 被調(diào)用時所耗費(fèi)的時間。這個時間單位是 clock tick,即“時鐘打點(diǎn)”。同時還有一個常數(shù)CLK_TCK,給出了機(jī)器時鐘每秒所走的時鐘打點(diǎn)數(shù)。于是為了獲得一個函數(shù) f 的運(yùn)行時間,我們只要在調(diào)用 f 之前先調(diào)用 clock(),獲得一個時鐘 打點(diǎn)數(shù) C1;在 f 執(zhí)行完成后再調(diào)用 clock(),獲得另一個時鐘打點(diǎn)數(shù) C2;兩次獲得的時鐘打點(diǎn)數(shù)之差 (C2-C1) 就是 f 運(yùn)行所消耗的時鐘打點(diǎn)數(shù),再除以常數(shù) CLK_TCK,就得到了以秒為單位的運(yùn)行時間。
這里不妨簡單假設(shè)常數(shù) CLK_TCK 為 100。現(xiàn)給定被測函數(shù)前后兩次獲得的時鐘打點(diǎn)數(shù),請你給出被測函數(shù)運(yùn)行的時間。
輸入格式:
輸入在一行中順序給出 2 個整數(shù) C1 和 C2。注意兩次獲得的時鐘打點(diǎn)數(shù)肯定不相同,即 C1 < C2,并且取值在 [0,107??]。
輸出格式:
在一行中輸出被測函數(shù)運(yùn)行的時間。運(yùn)行時間必須按照 hh:mm:ss(即2位的 時:分:秒)格式輸出;不足 1 秒的時間四舍五入到秒。
輸入樣例:
輸出樣例:
12:42:59思路:
累了,按照題目寫就行。
代碼示例如下:
#include<stdio.h> int main(){int c1,c2;scanf("%d %d",&c1,&c2);if(c1<c2){int time=(c2-c1)/100; //運(yùn)行時間 int hh=time/60/60; //所用秒數(shù)除以3600取整即為時針數(shù) int mm=(time%3600)/60;//分針數(shù) int ss=0;//怎么實(shí)現(xiàn)小數(shù)除呢???這塊代碼有問題!(四舍五入) float a=float(time%3600%60/60); if (float(a+0.5)>=1){ //不足 1 秒的時間四舍五入到秒 ss=time%3600%60+1;}else{ss=time%3600%60;}printf("%d:%d:%d",hh,mm,ss);}else{printf("輸入有誤!");}return 0; }2021年01月11日 ?
PAT B1046.劃拳
問題描述:
劃拳是古老中國酒文化的一個有趣的組成部分。酒桌上兩人劃拳的方法為:每人口中喊出一個數(shù)字,同時用手比劃出一個數(shù)字。如果誰比劃出的數(shù)字正好等于兩人喊出的數(shù)字之和,誰就贏了,輸家罰一杯酒。兩人同贏或兩人同輸則繼續(xù)下一輪,直到唯一的贏家出現(xiàn)。
下面給出甲、乙兩人的劃拳記錄,請你統(tǒng)計他們最后分別喝了多少杯酒。
輸入格式:
輸入第一行先給出一個正整數(shù) N(≤100),隨后 N 行,每行給出一輪劃拳的記錄,格式為:
甲喊 甲劃 乙喊 乙劃
其中“喊”是喊出的數(shù)字,“劃”是劃出的數(shù)字,均為不超過 100 的正整數(shù)(兩只手一起劃)。
輸出格式:
在一行中先后輸出甲、乙兩人喝酒的杯數(shù),其間以一個空格分隔。
輸入樣例:
輸出樣例:
1 2思路:
變量count1,count2分別記錄甲、乙輸?shù)拇螖?shù),即喝酒杯數(shù),此題較簡單,具體過程見代碼。
代碼示例如下:
#include<stdio.h> int main(){int J,Ja,Y,Ya;int N=0,count1=0,count2=0;//count1為甲輸?shù)拇螖?shù),count2為乙輸?shù)拇螖?shù) scanf("%d",&N); //輸入劃拳次數(shù) while(N--){scanf("%d%d%d%d",&J,&Ja,&Y,&Ya);if(J+Y==Ya&&J+Y!=Ja){ //甲輸 count1++;}else if(J+Y==Ja&&J+Y!=Ya){ //乙輸 count2++;}}printf("%d %d\n",count1,count2);return 0; }PAT B1012.數(shù)字分類
問題描述:
給定一系列正整數(shù),請按要求對數(shù)字進(jìn)行分類,并輸出以下 5 個數(shù)字:
A?1 = 能被 5 整除的數(shù)字中所有偶數(shù)的和;
A?2 = 將被 5 除后余 1 的數(shù)字按給出順序進(jìn)行交錯求和,即計算 n1?n2+n3?n4 ?;
A?3 = 被 5 除后余 2 的數(shù)字的個數(shù);
A?4 = 被 5 除后余 3 的數(shù)字的平均數(shù),精確到小數(shù)點(diǎn)后 1 位;
A?5 = 被 5 除后余 4 的數(shù)字中最大數(shù)字。
輸入格式:
每個輸入包含 1 個測試用例。每個測試用例先給出一個不超過 1000 的正整數(shù) N,隨后給出 N 個不超過 1000 的待分類的正整數(shù)。數(shù)字間以空格分隔。
輸出格式:
對給定的 N 個正整數(shù),按題目要求計算 A?1?? ~ A?5,并在一行中順序輸出。數(shù)字間以空格分隔,但行末不得有多余空格。若其中某一類數(shù)字不存在,則在相應(yīng)位置輸出 N。
輸入樣例 1:
輸出樣例 1:
30 11 2 9.7 9輸入樣例 2:
8 1 2 4 5 6 7 9 16輸出樣例 2:
N 11 2 N 9思路:
使用一個數(shù)組記錄符合條件的數(shù)字是否存在,再用另一個數(shù)組記錄輸出結(jié)果。對于讀入的數(shù)字,進(jìn)而判斷其屬于哪類。
代碼示例如下:
include<cstdio>int count[5]={0};int sum[5]={0};int n,x;scanf("%d",&n);for(int i=0;i<n;i++){scanf("%d",&x);//if(x%5==0&&x%2==0){ //為什么不能這樣寫??if(x%5==0){ //A1類if(x%2==0){sum[0]+=x;count[0]++;}}else if(x%5==1){ //A2類if(count[1]%2==0){sum[1]+=x;}else{sum[1]-=x;}count[1]++;}else if(x%5==2){ //A3類count[2]++;}else if(x%5==3){ //A4類sum[3]+=x;count[3]++;}else{if(x>sum[4]){ //A5類(其余的數(shù)即為“被5整除余4”的數(shù))sum[4]=x;}count[4]++;}}if(count[0]==0) printf("N "); //注意空格else printf("%d ",sum[0]);if(count[1]==0) printf("N ");else printf("%d ",sum[1]);if(count[2]==0) printf("N ");else printf("%d ",count[2]);if(count[3]==0) printf("N ");else printf("%.1f ",sum[3]*1.0/count[3]);//(%.1f)小數(shù)點(diǎn)后保留一位,前加double或用1.0進(jìn)行格式轉(zhuǎn)換 if(count[4]==0) printf("N");else printf("%d",sum[4]);return 0; }PAT B1018.錘子剪刀布
問題描述:
大家應(yīng)該都會玩“錘子剪刀布”的游戲:兩人同時給出手勢,勝負(fù)規(guī)則如圖所示:
現(xiàn)給出兩人的交鋒記錄,請統(tǒng)計雙方的勝、平、負(fù)次數(shù),并且給出雙方分別出什么手勢的勝算最大。
輸入格式:
輸入第 1 行給出正整數(shù) N,即雙方交鋒的次數(shù)。隨后 N 行,每行給出一次交鋒的信息,即甲、乙雙方同時給出的的手勢。C 代表“錘子”、J 代表“剪刀”、B 代表“布”,第 1 個字母代表甲方,第 2 個代表乙方,中間有 1 個空格。
輸出格式:
輸出第 1、2 行分別給出甲、乙的勝、平、負(fù)次數(shù),數(shù)字間以 1 個空格分隔。第 3 行給出兩個字母,分別代表甲、乙獲勝次數(shù)最多的手勢,中間有 1 個空格。如果解不唯一,則輸出按字母序最小的解。
輸入樣例:
輸出樣例:
5 3 2 2 3 5 B B思路:
代碼示例如下:
#include<stdio.h> int change(char c){if(c=='B') return 0;if(c=='C') return 1;if(c=='J') return 2; } int main(){int n;char arr[3]={'B','C','J'};scanf("%d",&n);int count1[3]={0},count2[3]={0};int hand1[3]={0},hand2[3]={0};char c1,c2;int k1,k2;while(n--){getchar();scanf("%c %c",&c1,&c2);k1=change(c1);k2=change(c2);if((k1+1)%3==k2){count1[0]++;count2[2]++;hand1[k1]++;} else if(k1==k2){count1[1]++;count2[1]++;}else{count1[2]++;count2[0]++;hand2[k2]++;}}printf("%d %d %d\n",count1[0],count1[1],count1[2]);printf("%d %d %d\n",count2[0],count2[1],count2[2]);int id1=0,id2=0;for(int i=0;i<3;i++){if(hand1[i]>hand1[id1]) id1=i;if(hand2[i]>hand2[id2]) id2=i;}printf("%c %c",arr[id1],arr[id2]);return 0; }PAT B1021.個位數(shù)統(tǒng)計
問題描述:
給定一個k位整數(shù)N = dk-110k-1 + … + d1101 + d0 (0<=di<=9, i=0,…,k-1, dk-1>0),請編寫程序統(tǒng)計每種不同的個位數(shù)字出現(xiàn)的次數(shù)。例如:給定N = 100311,則有2個0,3個1,和1個3。
輸入格式:
每個輸入包含 1 個測試用例,即一個不超過 1000 位的正整數(shù) N。
輸出格式:
對 N 中每一種不同的個位數(shù)字,以 D:M 的格式在一行中輸出該位數(shù)字 D 及其在 N 中出現(xiàn)的次數(shù) M。要求按 D 的升序輸出。
輸入樣例:
輸出樣例:
0:2 1:3 3:1思路:
原本思路是將輸入的整數(shù)n轉(zhuǎn)化為一維數(shù)組,再統(tǒng)計數(shù)字出現(xiàn)次數(shù),最后發(fā)現(xiàn)十分麻煩。不如直接定義輸入端為字符串。
代碼示例如下:
#include<stdio.h> int main(){int a[10]={0};//存放每個數(shù)字出現(xiàn)的次數(shù) char c[1000];scanf("%s",c); for(int i=0;c[i]!='\0';i++){//遍歷字符 a[c[i]-'0']++;//出現(xiàn)次數(shù) }for(int i=0;i<10;i++){//升序排列 if(a[i]!=0)printf("%d:%d\n",i,a[i]);}return 0; }一、入門模擬
1、查找元素
Codeup 1934 .找x
問題描述:輸入一個數(shù)n,然后輸入n個數(shù)值各不相同,再輸入一個值x,輸出這個值在這個數(shù)組中的下標(biāo)(從0開始,若不在數(shù)組中則輸出-1)。
輸入:測試數(shù)據(jù)有多組,輸入n(1<=n<=200),接著輸入n個數(shù),然后輸入x。
輸出:對于每組輸入,請輸出結(jié)果。
樣例輸入:
4
1 2 3 4
3
樣例輸出:
2
思路:
我們可以設(shè)定一個數(shù)組arr,用來存放n個數(shù),然后遍歷數(shù)組,尋找使得arr[k]==x成立的下標(biāo)k。若找到則輸出k,并退出查找;若當(dāng)k遍歷完數(shù)組之后還沒有找到x,則輸出-1。
看到題后第一次寫出的代碼:
#include<stdio.h> const int maxn=200; int arr[maxn]; //存放n個數(shù) int main(){ int n,x;scanf("%d",&n);if(n!=0){for(int i=0;i<n;i++){ scanf("%d",&arr[i]); //輸入 }}while(n!=0){ scanf("%d",&x); //輸入想要查詢的數(shù)for(int k=0;k<n;k++){ //遍歷數(shù)組 if(arr[k]==x){ //找到x printf("%d\n",k); //輸出對應(yīng)下標(biāo) break; //退出查詢 } if(k==n){ //沒有找到printf("-1\n"); //輸出-1 }}}return 0; }我的寫法好像有點(diǎn)辣雞?但是按照思路覺得這樣很清晰,但是!!此答案在編譯器上運(yùn)行是正常的,而在oj平臺上一直顯示輸出超限,絞盡腦汁百思不得其解,最后只能借助廣大網(wǎng)友的智慧腦瓜,問題就是應(yīng)該把輸入寫在while里面就解決問題啦!
以下是改正后的代碼:
#include<stdio.h> const int maxn=200; int arr[maxn]; int main(){ int n,x;while(scanf("%d",&n)!=EOF){for(int i=0;i<n;i++){scanf("%d",&arr[i]);}scanf("%d",&x);int k;for(k=0;k<n;k++){if(arr[k]==x){printf("%d\n",k);break;}}if(k==n){printf("-1\n");}}return 0; }2、圖形輸出
PAT B1036(跟奧巴馬一起編程)
問題描述:
美國總統(tǒng)奧巴馬不僅呼吁所有人都學(xué)習(xí)編程,甚至以身作則編寫代碼,成為美國歷史上首位編寫計算機(jī)代碼的總統(tǒng)。2014 年底,為慶祝“計算機(jī)科學(xué)教育周”正式啟動,奧巴馬編寫了很簡單的計算機(jī)代碼:在屏幕上畫一個正方形。現(xiàn)在你也跟他一起畫吧!
輸入格式:
輸入在一行中給出正方形邊長 N(3≤N≤20)和組成正方形邊的某種字符 C,間隔一個空格。
輸出格式:
輸出由給定字符 C 畫出的正方形。但是注意到行間距比列間距大,所以為了讓結(jié)果看上去更像正方形,我們輸出的行數(shù)實(shí)際上是列數(shù)的 50%(四舍五入取整)。
輸入樣例:
10 a
輸出樣例:
aaaaaaaaaa
a a
a a
a a
aaaaaaaaaa
思路:行數(shù)是列數(shù)的50%,且采取四舍五入,則當(dāng)列數(shù)col是偶數(shù)時,行數(shù)是col/2;當(dāng)列數(shù)col是奇數(shù)時,行數(shù)是col/2+1。
代碼如下:
#include<stdio.h> int main(){int row,col; //行、列 char C;scanf("%d %c",&col,&C); //輸入列數(shù)(即邊長)和字符 if(col%2==0) //col為偶數(shù) row=col/2;else //col為奇數(shù) row=col/2+1;//第1行 for(int i=0;i<col;i++){printf("%c",C); }printf("\n"); //第2~row-1行 for(int i=2;i<row;i++){printf("%c",C);for(int j=0;j<col-2;j++){printf(" "); }printf("%c\n",C);} //第row行for(int i=0;i<col;i++){printf("%c",C);} return 0; }總結(jié)
- 上一篇: MyBatis 流式查询
- 下一篇: Numpy中的堆叠(stack)操作