日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

PAT : PAT (Basic Level) Practice(中文)答案(1001 ~ 1095)(纯C编写)

發布時間:2023/12/20 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PAT : PAT (Basic Level) Practice(中文)答案(1001 ~ 1095)(纯C编写) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目集地址

報名了12月的PAT-B,先試試水。

已完成:2018/10/22 — 2018/11/14?


更新:(2018/12/09)PAT乙級考試100分!

考試代碼已更新

冬天坐火車跑去考試凍懵了,來年對戰PAT甲級考試!


目錄

目錄

題目集地址

目錄

1001害死人不償命的(3n+1)猜想

1002寫出這個數

1003我要通過!

1004成績排名

1005繼續(3n+1)猜想

1006換個格式輸出整數

1007素數對猜想

1008數組元素循環右移問題

1009說反話

1010一元多項式求導

1011A+B 和 C

1012數字分類

1013數素數

1014福爾摩斯的約會

1015德才論

1016部分A+B

1017A除以B

1018錘子剪刀布

1019數字黑洞

1020月餅

1021個位數統計

1022D進制的A+B

1023組個最小數

1024科學計數法

1025反轉鏈表

1026程序運行時間

1027打印沙漏

1028人口普查

1029舊鍵盤

1030完美數列

1031查驗身份證

1032挖掘機技術哪家強

1033舊鍵盤打字

1034有理數四則運算

1035插入與歸并

1036跟奧巴馬一起編程

1037在霍格沃茨找零錢

1038統計同成績學生

1039到底買不買

1040有幾個PAT

1041考試座位號

1042字符統計

1043輸出PATest

1044火星數字

1045快速排序

1046劃拳

1047編程團體賽

1048數字加密

1049數列的片段和

1050螺旋矩陣

1051復數乘法

1052賣個萌

1053住房空置率

1054求平均值

1055集體照

1056組合數的和

1057數零壹

1058選擇題

1059C語言競賽

1060愛丁頓數

1061判斷題

1062最簡分數

1063計算譜半徑

1064朋友數

1065單身狗

1066圖像過濾

1067試密碼

1068萬綠叢中一點紅

1069微博轉發抽獎

1070結繩

1071小賭怡情

1072開學寄語

1073多選題常見計分法

1074宇宙無敵加法器

1075鏈表元素分類

1076Wifi密碼

1077互評成績計算

1078字符串壓縮與解壓

1079延遲的回文數

1080MOOC期終成績

1081檢查密碼

1082射擊比賽

1083是否存在相等的差

1084外觀數列

1085PAT單位排行

1086就不告訴你

1087有多少不同的值

1088三人行

1089狼人殺-簡單版

1090危險品裝箱

>>以下5題為2018/12/09PAT參賽時所寫

1091N-自守數

1092最好吃的月餅

1093字符串A+B

1094谷歌的招聘

1095解碼PAT準考證

END


1001害死人不償命的(3n+1)猜想

#include<stdio.h> #include<stdlib.h> int main(int argc,char **argv) {int num;scanf("%d",&num);int cnt=0;while(num!=1){cnt++;if(num%2)num=(3*num+1)/2;elsenum=num/2;}printf("%d\n",cnt);return EXIT_SUCCESS; }

so so so so easy。


1002寫出這個數

#include<stdio.h> #include<stdlib.h> #include<string.h> int main(int argc,char **argv) {char* bignumber=(char*)calloc(105,sizeof(char));scanf("%s",bignumber);int sum=0;for(int i=0;i<strlen(bignumber);i++)sum+=bignumber[i]-'0';char sp[10][5]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};int list[105]={0},index=0;do{int now=sum%10;sum/=10;list[index++]=now;}while(sum);for(int i=index-1;i>=0;i--)printf("%s%c",sp[list[i]],i==0?'\n':' ');return EXIT_SUCCESS; }

so so easy。


1003我要通過!

#include<stdio.h> #include<stdlib.h> #include<string.h> int main(int argc,char **argv) {int cnt;scanf("%d",&cnt);while(cnt--){char str[105];scanf("%s",str);int state=0,i,Afront=0,Amiddle=0,Alater=0;for(i=0;i<strlen(str);i++){if(str[i]!='P'&&str[i]!='A'&&str[i]!='T')break;if(str[i]=='P')if(state==0)state=1;elsebreak;if(str[i]=='A')if(state==1)state=2; else if(state==2)Amiddle++;else if(state==0)Afront++;elseAlater++;if(str[i]=='T')if(state==2)state=3;elsebreak;}while(Amiddle){Alater-=Afront;Amiddle--;}if(i<strlen(str)||state!=3||Afront!=Alater)printf("NO\n");elseprintf("YES\n");}return EXIT_SUCCESS; }

分析題目三個通過條件可知。字符串中不能出現P、A、T之外的字符;PT之間只有一個A時(PAT),前后可以加上相同個數的A;PT中每多一個A(>2),后面加上前面個數個A。

統計字符串中P、T前中后A的個數判斷即可。


1004成績排名

#include<stdio.h> #include<stdlib.h> struct student {char name[15];char IDnumber[15];int score; }; typedef struct student student; int main(int argc,char **argv) {int cnt;scanf("%d",&cnt);student max={"","",0},min={"","",100};while(cnt--){student new;scanf("%s%s%d",new.name,new.IDnumber,&new.score);if(new.score>max.score)max=new;if(new.score<min.score)min=new;}printf("%s %s\n",max.name,max.IDnumber);printf("%s %s\n",min.name,min.IDnumber);return EXIT_SUCCESS; }

so so easy。


1005繼續(3n+1)猜想

#include<stdio.h> #include<stdlib.h> int book[4500]={0}; void getsp(int num) {if(book[num])return;while(num!=1){if(num%2)num=(3*num+1)/2;elsenum=num/2;book[num]=1;} } int main(int argc,char **argv) {int cnt;scanf("%d",&cnt);int num;int array[101]={0};while(cnt--){scanf("%d",&num);getsp(num);array[num]=1;}int firstblood=0;for(int i=100;i>0;i--)if(array[i]&&book[i]==0&&firstblood==0){printf("%d",i);firstblood=1;}else if(array[i]&&book[i]==0)printf(" %d",i);putchar('\n');return EXIT_SUCCESS; }

略坑。題目意思是第一個直接執行3n+1猜想,并記錄過程中的每個數,注意是過程數;后面的每個數先判斷是否已經記錄過,記錄過就直接跳過(記錄過后面算就沒意義了),沒記錄過就執行3n+1猜想并記錄過程數。

再挨個判斷每個數是否在記錄中,記錄中存在則輸出。記錄過程的數組開大點,4500左右。


1006換個格式輸出整數

#include<stdio.h> #include<stdlib.h> int main(int argc,char **argv) {int num;scanf("%d",&num);int chundred=num/100;while(chundred--) putchar('B');num%=100;int cten=num/10;while(cten--) putchar('S');num%=10;int st=1;while(num>=st){putchar('0'+st);st++; }putchar('\n');return EXIT_SUCCESS; }

so so easy。


1007素數對猜想

#include<stdio.h> #include<stdlib.h> #include<math.h> int getsp(int num) {int sum=0;int history=2;for(int k=2;k<=num;k++){int is=0;for(int i=2;i<=(int)sqrt(k);i++)if(k%i==0){is=1;break;}if(!is&&k-history==2)sum++;if(!is)history=k;}return sum; } int main(int argc,char **argv) {int num;scanf("%d",&num);printf("%d\n",getsp(num));return EXIT_SUCCESS; }

挨個計算素數,判斷當前值和上一個歷史值之差是否為 2 。


1008數組元素循環右移問題

#include<stdio.h> #include<stdlib.h> int main(int argc,char **argv) {int num,rr;scanf("%d%d",&num,&rr);int array[105]={0};for(int i=1;i<=num;i++)scanf("%d",&array[i]);int begin=num-rr%num+1;for(int i=1;i<=num;i++){if(begin>num)begin=1;printf("%d%c",array[begin++],i==num?'\n':' ');}return EXIT_SUCCESS; }

模擬實現匯編的 RR 。


1009說反話

#include<stdio.h> #include<string.h> char str[85]; int book[85][2]; int main(int argc,char** argv) {scanf("%[^\n]",str);int ind,ins=strlen(str),con=0,booknow=0;for(ind=0;ind<ins;ind++){if(str[ind]!=' '&&!con){con=1;book[booknow][0]=ind;}else if(str[ind]==' '&&con){con=0;book[booknow++][1]=ind;}}if(con)book[booknow++][1]=ins;for(ind=booknow-1;ind>=0;ind--){for(ins=book[ind][0];ins<book[ind][1];ins++)printf("%c",str[ins]);printf("%c",ind==0?'\n':' ');}return 0; }

記錄每個單詞的起始和終止位置。


1010一元多項式求導

#include<stdio.h> #include<stdlib.h> int main(int argc,char **argv) {int sp[1005][2];int i=0;while(scanf("%d%d",&sp[i][0],&sp[i][1])!=EOF)i++;int firstblood=0;for(int j=0;j<=i-1;j++)if(sp[j][0]*sp[j][1]){if(firstblood==0)firstblood=1;elseputchar(' ');printf("%d %d",sp[j][0]*sp[j][1],sp[j][1]-1);}if(!firstblood)printf("0 0");putchar('\n');return EXIT_SUCCESS; }

小小小坑。存在負指數。


1011A+B 和 C

#include<stdio.h> #include<stdlib.h> #include<string.h> #define max(a,b) (a<b?b:a) #define min(a,b) (a>b?b:a) int main(int argc, char *argv[]) {int cnt;scanf("%d",&cnt);for(int i=1;i<=cnt;i++){long long a,b,c;scanf("%ld%ld%ld",&a,&b,&c);if(a+b>c)printf("Case #%d: true\n",i);elseprintf("Case #%d: false\n",i);} return 0; }

so so so so easy……


1012數字分類

#include<stdio.h> #include<stdlib.h> int main(int argc,char **argv) {int cnt;scanf("%d",&cnt);int A1=0,A2=0,A3=0,A5=0,A2p=-1,A2els=0;double A4=0.0,A4p=0.0;while(cnt--){int num;scanf("%d",&num);if(num%5==0&&num%2==0)A1+=num;if(num%5==1){A2p*=-1;A2+=A2p*num;A2els=1;}if(num%5==2){A3++;}if(num%5==3){A4+=num;A4p++;}if(num%5==4){if(num>A5)A5=num;}}if(A1==0)printf("N ");elseprintf("%d ",A1);if(A2els==0)printf("N ");elseprintf("%d ",A2);if(A3==0)printf("N ");elseprintf("%d ",A3);if(A4p==0.0)printf("N ");elseprintf("%.1lf ",A4/A4p);if(A5==0)printf("N\n");elseprintf("%d\n",A5);return EXIT_SUCCESS; }

小小小坑,判斷每一個情況是否有值。


1013數素數

#include<stdio.h> #include<stdlib.h> #include<math.h> int ispre(int num) {if(num==1)return 0;if(num==2)return 1;for(int i=2;i<=num/i;i++){if(num%i==0)return 0;}return 1; } int array[10002]; int main(int argc,char **argv) {int M,N,cnt=0;scanf("%d%d",&M,&N);int i,j;for(i=2,j=1;j<=10000;i++){if(ispre(i))array[j++]=i;}for(i=M;i<=N;i++){cnt++;printf("%d",array[i]);if(cnt%10==0||i==N)printf("\n");elseprintf(" ");}return EXIT_SUCCESS; }

so so so easy,先打表,按要求依次輸出。


1014福爾摩斯的約會

#include<stdio.h> #include<stdlib.h> #include<ctype.h> int main(int argc,char **argv) {char str1[100],str2[100],str3[100],str4[100];scanf("%s%s%s%s",str1,str2,str3,str4);char week[10][4]={"MON","TUE","WED","THU","FRI","SAT","SUN"};int first=-1,secend=-1,third=-1;for(int i=0;;i++){if(str1[i]==str2[i]&&first!=-1){if(isdigit(str1[i])){secend=str1[i]-'0';break;}else if(str1[i]>='A'&&str1[i]<='N'){secend=str1[i]-'A'+10;break;}}if(str1[i]==str2[i]&&first==-1&&(str1[i]>='A'&&str1[i]<='G')){first=str1[i]-'A';}}for(int i=0;;i++){if(str3[i]==str4[i]&&third==-1&&isalpha(str3[i])){third=i;break;}}printf("%s %02d:%02d\n",week[first],secend,third);return EXIT_SUCCESS; }

小小坑。A-N和A-G的范圍不能用無腦直接用isupper……。


1015德才論

#include<stdio.h> #include<stdlib.h> struct man {int number,de,cai;int rank; }; struct man sp[100000]; int compare(const void *a,const void *b) {const struct man *as=a;const struct man *bs=b;if(as->rank!=bs->rank)return -(as->rank-bs->rank);else if((as->de+as->cai)!=(bs->de+bs->cai))return -(as->de+as->cai)+(bs->de+bs->cai);else if(as->de!=bs->de)return -(as->de-bs->de);elsereturn as->number-bs->number; } int main(void) {int N,baseline,additionline;scanf("%d%d%d",&N,&baseline,&additionline);int index=0,sum=0;while(N--){int a,b,c,d;scanf("%d%d%d",&a,&b,&c);if(b<baseline||c<baseline)continue;sum++;if(b>=additionline&&c>=additionline){d=4;sp[index].number=a;sp[index].de=b;sp[index].cai=c;sp[index++].rank=d;continue;}if(b>=additionline&&c<additionline){d=3;sp[index].number=a;sp[index].de=b;sp[index].cai=c;sp[index++].rank=d;continue;}if(b>=c&&b<additionline&&c<additionline){d=2;sp[index].number=a;sp[index].de=b;sp[index].cai=c;sp[index++].rank=d;continue;}d=1;sp[index].number=a;sp[index].de=b;sp[index].cai=c;sp[index++].rank=d;}qsort(sp,index,sizeof(struct man),compare);printf("%d\n",sum);for(int i=0;i<index;i++){printf("%d %d %d\n",sp[i].number,sp[i].de,sp[i].cai);}return EXIT_SUCCESS; }

編寫compare函數借助qsort即可,STL的sort同理。


1016部分A+B

#include<stdio.h> #include<stdlib.h> int getnum(int sp,int key) {int sumn=0;while(sp){int sol=sp%10;if(sol==key)sumn=sumn*10+key;sp/=10;}return sumn; } int main(int argc,char *argv[]) {int a,as,b,bs;scanf("%d%d%d%d",&a,&as,&b,&bs);printf("%d\n",getnum(a,as)+getnum(b,bs));return EXIT_SUCCESS; }

so easy。提取符合的每一位相加。


1017A除以B

#include<stdio.h> #include<stdlib.h> #include<string.h> int main(int argc,char *argv[]) {char bignumber[1005];char div[1005];scanf("%s",bignumber);int key;scanf("%d",&key);int mod=0,index=0,firstblood=0;for(int i=0;i<strlen(bignumber);i++){mod+=bignumber[i]-'0';if(key>mod){mod*=10;if(firstblood)div[index++]='0';continue;}if(!firstblood)firstblood=1;div[index++]=mod/key+'0';mod=mod%key*10;}if(index==0)div[index++]='0';div[index]=0;printf("%s %d\n",div,mod/10);return EXIT_SUCCESS; }

小坑,存在除數為 0 的情況。


1018錘子剪刀布

#include<stdio.h> #include<stdlib.h> int main(int argc,char *argv[]) {int cnt;scanf("%d%*c",&cnt);int wina[5]={0},winb[5]={0},wa=0,wb=0,equ=0,max;char maxa='B',maxb='B';while(cnt--){char q,w;scanf("%c %c%*c",&q,&w);if(q=='C'&&w=='J'||q=='J'&&w=='B'||q=='B'&&w=='C'){wa++;if(q=='B')wina[1]++;if(q=='C')wina[2]++;if(q=='J')wina[3]++;max=wina[1],maxa='B';if(wina[2]>max)max=wina[2],maxa='C';if(wina[3]>max)max=wina[3],maxa='J';continue;}else if(w=='C'&&q=='J'||w=='J'&&q=='B'||w=='B'&&q=='C'){wb++;if(w=='B')winb[1]++;if(w=='C')winb[2]++;if(w=='J')winb[3]++;max=winb[1],maxb='B';if(winb[2]>max)max=winb[2],maxb='C';if(winb[3]>max)max=winb[3],maxb='J';continue;}elseequ++;}printf("%d %d %d\n%d %d %d\n",wa,equ,wb,wb,equ,wa);printf("%c %c\n",maxa,maxb);return EXIT_SUCCESS; }

so easy。統計輸贏情況。


1019數字黑洞

#include<stdio.h> #include<stdlib.h> int main(int argc,char *argv[]) {int whole;scanf("%d",&whole);int a[5],firstblood=0;while(whole!=6174&&whole!=0||firstblood==0){if(!firstblood)firstblood=1;a[1]=whole%10;a[2]=whole/10%10;a[3]=whole/100%10;a[4]=whole/1000%10;for(int i=1;i<4;i++)for(int j=1;j<=4-i;j++)if(a[j]>a[j+1]){int temp=a[j];a[j]=a[j+1];a[j+1]=temp;}int big=a[1]+a[2]*10+a[3]*100+a[4]*1000;int small=a[4]+a[3]*10+a[2]*100+a[1]*1000;whole=big-small;printf("%04d - %04d = %04d\n",big,small,whole);}return EXIT_SUCCESS; }

小坑,輸入是6174的情況。


1020月餅

#include<stdio.h> #include<stdlib.h> //#define HOST typedef struct {double si;double sum,num; }moon; moon cakes[1005]={0}; int compare(const void *a,const void *b) {const moon *sa=(const moon*)a;const moon *sb=(const moon*)b;if(sb->si>sa->si)return 1;if(sb->si<sa->si)return -1;return 0; } int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint n,need;scanf("%d%d",&n,&need);for(int i=0;i<n;i++)scanf("%lf",&cakes[i].num);for(int i=0;i<n;i++)scanf("%lf",&cakes[i].sum);for(int i=0;i<n;i++)cakes[i].si=cakes[i].sum/cakes[i].num;qsort(cakes,n,sizeof(moon),compare);double ans=0.0;for(int i=0;i<n;i++){if(need<=cakes[i].num){ans+=cakes[i].si*need;break;}else{ans+=cakes[i].sum;need-=cakes[i].num;}}printf("%.2lf\n",ans);return EXIT_SUCCESS; }

小坑。第二行第三行輸入的庫存和總價題目說明是正數,可以是小數的。


1021個位數統計

#include<stdio.h> #include<stdlib.h> #include<string.h> int main(int argc,char *argv[]) {char bignumber[1005];int book[10]={0};scanf("%s",bignumber);for(int i=0;i<strlen(bignumber);i++)book[bignumber[i]-'0']++;for(int i=0;i<10;i++)if(book[i])printf("%d:%d\n",i,book[i]);return EXIT_SUCCESS; }

so so so so easy。統計各個數字出現個數輸出。


1022D進制的A+B

#include<stdio.h> #include<stdlib.h> #include<string.h> int* tobasenumber(long long original,int base) {static int array[30]={0},index=1;if(!original)array[index++]=0;while(original){array[index++]=original%base;original/=base;}array[0]=index-1;return array; } int main(int argc,char *argv[]) {long long a,b;scanf("%lld%lld",&a,&b);long long sum=a+b;int base;scanf("%d",&base);int *point=tobasenumber(sum,base);for(int i=point[0];i>0;i--)printf("%d",point[i]);putchar('\n');return EXIT_SUCCESS; }

小坑。存在和為 0 的情況。


1023組個最小數

#include<stdio.h> #include<stdlib.h> #include<string.h> int main(int argc,char *argv[]) {int book[10]={0};for(int i=0;i<10;i++)scanf("%d",&book[i]);int index=1;while(book[index]==0)index++;book[index]--;printf("%d",index);index=0;while(index<=9){if(!book[index]){index++;continue; }printf("%d",index);book[index]--;}putchar('\n');return EXIT_SUCCESS; }

so easy。第一個數從1開始取最小數,后面的數從零開始取。


1024科學計數法

#include<stdio.h> #include<stdlib.h> #include<string.h> int main(int argc,char *argv[]) {char str[11000];scanf("%s",str);int ends=0;for(int i=1;;i++)if(str[i]=='E'){ends=i;break;}int psss=0,endall=strlen(str)-1,copyends=ends+2;while(endall>=copyends){psss=psss*10+str[copyends]-'0';copyends++;}if(str[ends+1]=='-')psss=-psss;if(str[0]=='-')putchar(str[0]);if(psss>0){printf("%c",str[1]);for(int i=0;i<ends-3||i<psss;i++){if((i==psss)&&(i<ends-3))putchar('.');if(i<ends-3)putchar(str[i+3]);elseputchar('0');}}else if(psss<0){putchar('0');putchar('.');for(int i=1;i<abs(psss);i++)putchar('0');putchar(str[1]);for(int i=0;i<ends-3;i++)putchar(str[i+3]);}else{for(int i=1;i<ends;i++)putchar(str[i]);}putchar('\n');return EXIT_SUCCESS; }

先把輸入處理成有效數字、正負號、指數值幾部分,后根據指數正、負、零,分析輸出即可。


1025反轉鏈表

#include<stdio.h> #include<stdlib.h> //#define HOST typedef struct {int data;int next; }node; node sp[100005]={0}; int ans[100005]={0}; void reverse(int left,int right) {while(left<right){int temp=ans[left];ans[left]=ans[right];ans[right]=temp;left++,right--;}return; } int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint begin,cnt,isp;scanf("%d%d%d",&begin,&cnt,&isp);for(int i=0;i<cnt;i++){int temp;scanf("%d",&temp);scanf("%d%d",&sp[temp].data,&sp[temp].next);}int index=0;while(begin!=-1){ans[index++]=begin;begin=sp[begin].next;}for(int i=0;i<(index)/isp;i++){int left=i*isp,right=(i+1)*isp-1;reverse(left,right);}printf("%05d %d",ans[0],sp[ans[0]].data);for(int i=1;i<index;i++)printf(" %05d\n%05d %d",ans[i],ans[i],sp[ans[i]].data);printf(" -1\n");return EXIT_SUCCESS; }

讀取鏈表數據,轉換成數組存儲。逐一反轉數組即可。


1026程序運行時間

#include<stdio.h> #include<stdlib.h> int main(int argc,char **argv) {int time1,time2;scanf("%d%d",&time1,&time2);float time=(time2-time1)/100.0-(time2-time1)/100;if(time>=0.5)time=(time2-time1)/100+1;elsetime=(time2-time1)/100;int sp=time;printf("%02d:%02d:%02d\n",sp/3600,sp%3600/60,sp%3600%60);return EXIT_SUCCESS; }

so so easy。得到程序運行秒數后,四舍五入成整數后按格式輸出。


1027打印沙漏

#include<stdio.h> int main(int argc,char** argv) {int sum;char ch;scanf("%d %c",&sum,&ch);int i=1,msum=1,fk=sum-msum;while(fk>=(i+2)*2){i+=2;msum+=2*i;fk=sum-msum;}int ins=i;while(ins>1){int ind=ins,inf=(i-ins)/2;while(inf--)putchar(' ');while(ind--)putchar(ch);putchar('\n');ins-=2;}int inf=(i-1)/2;while(inf--)putchar(' ');putchar(ch);putchar('\n');ins=3;while(ins<=i){int ind=ins,inf=(i-ins)/2;while(inf--)putchar(' ');while(ind--)putchar(ch);putchar('\n');ins+=2;}printf("%d\n",fk);return 0; }

老題目,先計算好沙漏第一行字符個數和剩余值,循環輸出即可。


1028人口普查

#include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct member {char name[10];int year,month,day; }member;int compare(member x,member y) {if(x.year==y.year)if(x.month==y.month)if(x.day==y.day)return 0;elsereturn x.day-y.day;elsereturn x.month-y.month;elsereturn x.year-y.year; } int check(member x) {if(x.year>2014)return 1;if(x.year==2014){if(x.month>9)return 1;if(x.month==9)if(x.day>6)return 1;}if(x.year<1814)return 1;if(x.year==1814){if(x.month<9)return 1;if(x.month==9)if(x.day<6)return 1;}return 0; } int main(int argc, char *argv[]) {int cnt;scanf("%d",&cnt);member maxn,minn;int sumcurrect=0,firstblood=0;while(cnt--){member now;scanf("%s%d/%d/%d",now.name,&now.year,&now.month,&now.day);if(check(now))continue;sumcurrect++;if(!firstblood){firstblood=1;maxn=minn=now;}else{if(compare(now,maxn)>0)maxn=now;if(compare(minn,now)>0)minn=now; } }if(firstblood)printf("%d %s %s\n",sumcurrect,minn.name,maxn.name);elseprintf("0\n");return 0; }

天坑。存在沒有一個滿足的人的情況(只輸出一個 0 ),還需考慮只有一個滿足的人的情況(最大最小輸出同一個人的名字)。


1029舊鍵盤

#include<stdio.h> #include<ctype.h> int book[128]={0}; char stack[1000]={0}; int main(int argc,char** agrv) {char str1[1000],str2[1000];scanf("%s%s",str1,str2);int point1=0,point2=0,point3=0;while(str1[point1]){if(str1[point1]==str2[point2]){point1++;point2++;}else{int sp=toupper(str1[point1]);if(book[sp]==0){book[sp]=1;stack[point3++]=sp;}point1++;}}stack[point3]=0;printf("%s\n",stack);return 0; }

so easy。


1030完美數列

#include<stdio.h> #include<stdlib.h> #define max(x,y) ((x>y)?(x):(y)) long long array[100005]; int compare(const void *a,const void *b) {return (*(long long*)a-*(long long*)b); } int main(int argc,char **argv) {int cnt,k;scanf("%d%d",&cnt,&k);for(int i=0;i<cnt;i++){scanf("%lld",&array[i]);}qsort(array,cnt,sizeof(long long),compare);int sp=0;for(int i=0;i<cnt;i++)for(int j=i+sp;j<cnt;j++)if(array[i]*k<array[j])break;elsesp=max(sp,j-i+1);printf("%d\n",sp);return EXIT_SUCCESS; }

排序后循環查找最大可能值。


1031查驗身份證

#include<stdio.h> #include<stdlib.h> int main(int argc,char *argv[]) {int cnt;scanf("%d",&cnt);int table[20]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};int allok=1;while(cnt--){char idcardnumber[20];scanf("%s",idcardnumber);int sum=0;for(int i=0;i<17;i++)sum+=(idcardnumber[i]-'0')*table[i];sum%=11;char book[20]={'1','0','X','9','8','7','6','5','4','3','2'};if(book[sum]!=idcardnumber[17]){if(allok)allok=0;printf("%s\n",idcardnumber);}}if(allok)printf("All passed\n");return EXIT_SUCCESS; }

按所給計算方法判斷是否通過。


1032挖掘機技術哪家強

#include<stdio.h> #include<stdlib.h> int main(int argc,char *argv[]) {int cnt,max=0;scanf("%d",&cnt);int *array=(int*)calloc(100005,sizeof(int));while(cnt--){int a,b;scanf("%d%d",&a,&b);array[a]+=b;if(array[max]<array[a])max=a;}printf("%d %d\n",max,array[max]);free(array);return EXIT_SUCCESS; }

so easy。


1033舊鍵盤打字

#include <stdio.h> #include <ctype.h> int main(int argc,char** argv) {char A[128] = {0}, ch;while ((ch = getchar()) != '\n')A[ch]++;while ((ch = getchar()) != '\n')if ((isupper(ch) && A[43]) || A[toupper(ch)])continue;elseputchar(ch);return 0; }

記錄第一個字符串出現字符,過濾第二個字符串。


1034有理數四則運算

#include<stdio.h> #include<stdlib.h> #define mabs(a) (a<0?(-a):(a)) long long gcd(long long m,long long n) {if(m<0)m=-m;if(n<0)n=-n;return (m%n?gcd(n,m%n):n); } void printnum(long long a,long long b) {if (b == 0){printf("Inf");return;}int sign=1;if((a<0&&b>0)||(a>0&&b<0)){sign=-1;}a=mabs(a);b=mabs(b);int temp=gcd(a, b);a/=temp;b/=temp;if(sign==-1)printf("(-");if(b==1)printf("%lld", a);else if(a>b)printf("%lld %lld/%lld",a/b,a%b,b);elseprintf("%ld/%ld", a, b);if(sign==-1)printf(")");return; } int main(int argc,char **argv) {long long a[2],b[2];scanf("%lld/%lld %lld/%lld",&a[0],&a[1],&b[0],&b[1]);printnum(a[0],a[1]);printf(" + ");printnum(b[0],b[1]);printf(" = ");printnum(a[0]*b[1]+a[1]*b[0],a[1]*b[1]);putchar('\n');printnum(a[0],a[1]);printf(" - ");printnum(b[0],b[1]);printf(" = ");printnum(a[0]*b[1]-a[1]*b[0],a[1]*b[1]);putchar('\n');printnum(a[0],a[1]);printf(" * ");printnum(b[0],b[1]);printf(" = ");printnum(a[0]*b[0],a[1]*b[1]);putchar('\n');printnum(a[0],a[1]);printf(" / ");printnum(b[0],b[1]);printf(" = ");printnum(a[0]*b[1],a[1]*b[0]);putchar('\n');return EXIT_SUCCESS; }

坑。必須使用long long。分成兩部分,一部分是直接計算分子、分母值及格式輸出;另一部分是化簡分子、分母為要求的格式。


1035插入與歸并

#include<stdio.h> #include<stdlib.h> //#define HOST void InsertionSort(int *arr,int begin,int len) {if(begin>=len)begin=len-1;int temp=arr[begin];for(int i=begin-1;i>=0;i--){if(arr[i]>temp)arr[i+1]=arr[i],arr[i]=temp;elsebreak;}return; } void MergeSort(int *arr,int begin,int len) {if(begin>=len)begin=len;int start=0,end=0;for(int i=0;i<len;i+=begin){start=i;end=(start+begin>len?len:start+begin);for(int m=end-1;m>=start;m--){int iloc=-1,max=arr[start],l=0;for(l=start;l<=m;l++)if(arr[l]>=max)iloc=l,max=arr[l]; if(iloc>=0)arr[iloc]=arr[l-1],arr[l-1]=max; }}return; } int match(int *diff1,int *diff2,int len) {for(int i=0;i<len;i++)if(diff1[i]!=diff2[i])return 0;return 1; } int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint cnt,num1[105]={0},num2[105]={0},num1s[105]={0};scanf("%d",&cnt);for(int i=0;i<cnt;i++)scanf("%d",&num1[i]);for(int i=0;i<cnt;i++)scanf("%d",&num2[i]);for(int i=0;i<cnt;i++) num1s[i]=num1[i];for(int i=1;i<cnt;i++){InsertionSort(num1s,i,cnt);if(match(num2,num1s,cnt)){printf("Insertion Sort\n"); InsertionSort(num1s,i+1,cnt);for(int j=0;j<cnt;j++)printf("%d%c",num1s[j],j==cnt-1?'\n':' ');return EXIT_SUCCESS;}}for(int i=1;i<=2*cnt;i*=2){MergeSort(num1,i,cnt);if(match(num2,num1,cnt)){printf("Merge Sort\n");MergeSort(num1,2*i,cnt);for(int j=0;j<cnt;j++)printf("%d%c",num1[j],j==cnt-1?'\n':' ');return 0;}} return EXIT_SUCCESS; }

考察插入排序和歸并排序。一步一步進行插入/歸并排序,如果出現與目標序列一致則輸出排序種類,再進行一次對應排序后輸出序列。


1036跟奧巴馬一起編程

#include<stdio.h> #include<stdlib.h> int main(int argc,char *argv[]) {int cnt;char ch;scanf("%d %c",&cnt,&ch);for(int i=1;i<=cnt;i++)putchar(ch);putchar('\n');for(int i=1;i<=(int)((cnt/2.0)+0.5)-2;i++){putchar(ch);for(int j=1;j<=cnt-2;j++)putchar(' ');putchar(ch);putchar('\n');}for(int i=1;i<=cnt;i++)putchar(ch);putchar('\n'); return EXIT_SUCCESS; }

so easy。


1037在霍格沃茨找零錢

#include<stdio.h> #include<stdlib.h> int main(int argc,char *argv[]) {int a,b,c;int x,y,z;scanf("%d.%d.%d",&a,&b,&c);scanf("%d.%d.%d",&x,&y,&z);int abc,xyz;abc=c+b*29+a*17*29;xyz=z+y*29+x*17*29;abc-=xyz;if(abc>0)putchar('-');elseabc=-abc;printf("%d.%d.%d\n",abc/(17*29),abc%(17*29)/29,abc%(17*29)%29);return EXIT_SUCCESS; }

so easy。單位轉換。


1038統計同成績學生

#include<stdio.h> #include<stdlib.h> int main(int argc,char *argv[]) {int *array=(int*)calloc(101,sizeof(int));int cnt;scanf("%d",&cnt);while(cnt--){int score;scanf("%d",&score);array[score]++;}scanf("%d",&cnt);while(cnt--){int sp;scanf("%d",&sp);printf("%d",array[sp]);if(cnt)printf(" ");}free(array);return EXIT_SUCCESS; }

so so so easy。


1039到底買不買

#include<stdio.h> #include<stdlib.h> int main(int argc,char *argv[]) {int *array=(int*)calloc(128,sizeof(int));char sp;int total=0;while(sp=getchar(),sp!='\n'){array[sp]++;total++; }while(sp=getchar(),sp!='\n'){array[sp]--;total--; }int require=0,none=1,redundant=0;for(int i=1;i<128;i++){if(array[i]<0){if(none)none=0;require+=-array[i]; }if(array[i]>0)redundant+=array[i]; }if(none)printf("Yes %d\n",redundant);elseprintf("No %d\n",require);free(array);return EXIT_SUCCESS; }

根據第一個字符串統計第二個字符串,多出/缺少的字符數。


1040有幾個PAT

#include<stdio.h> #include<stdlib.h> #define MOD 1000000007 int main(int argc,char *argv[]) {int p=0,pa=0,pat=0;char sp;while(sp=getchar(),sp!='\n'){if(sp=='P')p++;if(sp=='A'){pa+=p;pa%=MOD;}if(sp=='T'){pat+=pa;pat%=MOD;}}printf("%d\n",pat);return EXIT_SUCCESS; }

每個A都可以和前面任意一個P配對,每個T都可以和前面任意一個PA配對。還需不斷的取余。

(a+b+c)%d==(a%d+b%d+c%d)%d


1041考試座位號

#include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct {char ID[20];int num; }student; int main(int argc,char **argv) {int cnt;scanf("%d",&cnt);student *sp=(student*)calloc(cnt+1,sizeof(student));while(cnt--){student now;int index;scanf("%s %d %d",now.ID,&index,&now.num);strcpy(sp[index].ID,now.ID);sp[index].num=now.num;}scanf("%d",&cnt);while(cnt--){int index;scanf("%d",&index);printf("%s %d\n",sp[index].ID,sp[index].num);}free(sp);return EXIT_SUCCESS; }

so easy。結構體數組存取。


1042字符統計

#include<stdio.h> #include<stdlib.h> #include<ctype.h> int main(int argc,char **argv) {int alpha[26]={0};char ch;while((ch=getchar())!=EOF)if(isalpha(ch))alpha[tolower(ch)-'a']++;int max=0,sp;for(int i=25;i>=0;i--)if(alpha[i]>=max)sp=i,max=alpha[i];printf("%c %d\n",sp+'a',max);return EXIT_SUCCESS; }

將字母變成小寫后,統計出現個數。逆序查找最大值。


1043輸出PATest

#include<stdio.h> #include<stdlib.h> #include<ctype.h> int main(int argc,char **argv) {int alpha[7]={0};char ch;int sum=0;while((ch=getchar())!=EOF){if(ch=='P')alpha[1]++,sum++;if(ch=='A')alpha[2]++,sum++;if(ch=='T')alpha[3]++,sum++;if(ch=='e')alpha[4]++,sum++;if(ch=='s')alpha[5]++,sum++;if(ch=='t')alpha[6]++,sum++;}char sp[7]={0,'P','A','T','e','s','t'};while(sum)for(int i=1;i<=6;i++)if(alpha[i]>0){alpha[i]--;sum--;putchar(sp[i]);}return EXIT_SUCCESS; }

so so easy,篩選輸出。


1044火星數字

#include<stdio.h> #include<stdlib.h> #include<ctype.h> #include<string.h> char mars1[13][4]={"","tam","hel","maa","huh","tou","kes",\ "hei","elo","syy","lok","mer","jou"}; char mars2[13][5]={"tret","jan","feb","mar","apr","may","jun",\ "jly","aug","sep","oct","nov","dec"}; void tomars(int num) {int sp1=num/13,sp2=num%13;if(sp1)printf("%s",mars1[sp1]);if(sp1&&sp2)putchar(' ');if((!sp2&&!sp1)||sp2)printf("%s",mars2[sp2]);putchar('\n');return; } void toearth(char *str) {int sum=0;char temp[4]="",temps[5]="";sscanf(str,"%s%s",temp,temps);int sp1,sp2;for(int i=1;i<=12;i++)if(!strcmp(mars1[i],temp)){sum+=i*13;break;}for(int i=0;i<=12;i++)if(!strcmp(mars2[i],temps)||!strcmp(mars2[i],temp)){sum+=i;break;}printf("%d\n",sum);return; } int main(int argc,char **argv) {int cnt;scanf("%d",&cnt);while(cnt--){char str[20]={0};scanf("%*c%[^\n]",str);if(isdigit(str[0])){int num;sscanf(str,"%d",&num);tomars(num);}elsetoearth(str);}return EXIT_SUCCESS; }

花里胡哨版進制轉換,用sscanf從字符串中讀取可以簡便許多。


1045快速排序

#include<stdio.h> #include<stdlib.h> int main(int argc,char **argv) {int cnt;scanf("%d",&cnt);int sp[100001][3],dp[100001];for(int i=0;i<cnt;i++)scanf("%d",&sp[i][0]);int leftmax=0;for(int i=0;i<cnt;i++){sp[i][1]=leftmax;if(sp[i][0]>leftmax)leftmax=sp[i][0];}int rightmin=1<<30;for(int i=cnt-1;i>=0;i--){sp[i][2]=rightmin;if(sp[i][0]<rightmin)rightmin=sp[i][0];}int index=0,sum=0;for(int i=0;i<cnt;i++){int ok=1;if(sp[i][1]>=sp[i][0])ok=0;if(sp[i][2]<=sp[i][0])ok=0;if(ok){sum++;dp[index++]=sp[i][0];}}printf("%d\n",sum);for(int i=0;i<index;i++){ printf("%d",dp[i]);if(i!=index-1)putchar(' '); }putchar('\n');return EXIT_SUCCESS; }

此題天坑!首先如果輸入 0 的話,得到的輸出應該是 0后面跟兩個回車……測試點2就是輸入為0。

其次,題目中說按遞增順序輸出這些元素。意思是按原順序輸出,并不用遞增排序。

于是跑一遍左側最大值、右側最小值,選擇滿足要求的輸出就完事了……


1046劃拳

#include<stdio.h> #include<stdlib.h> int main(int argc,char **argv) {int cnt;scanf("%d",&cnt);int suma=0,sumb=0;while(cnt--){int a,b,sa,sb;scanf("%d%d%d%d",&a,&sa,&b,&sb);if(a+b==sa&&a+b!=sb)suma++;if(a+b==sb&&a+b!=sa)sumb++;}printf("%d %d\n",sumb,suma);return EXIT_SUCCESS; }

so so so so easy。


1047編程團體賽

#include<stdio.h> #include<stdlib.h> int main(int argc,char **argv) {int cnt;int score[1001]={0};scanf("%d",&cnt);while(cnt--){int team,member;scanf("%d-%*d",&team);scanf("%d",&member);score[team]+=member;}int max=0;for(int i=1;i<=1000;i++){if(score[i]>score[max])max=i;}printf("%d %d\n",max,score[max]);return EXIT_SUCCESS; }

so so so easy。


1048數字加密

#include<stdio.h> #include<stdlib.h> #include<string.h> char gotch(int num) {if(num>=0&&num<=9)return num+'0';else if(num==10)return 'J';else if(num==11)return 'Q';else if(num==12)return 'K';return -1; } int main(int argc,char **argv) {char *ans=NULL,*other=NULL;char num1[105],num2[105];scanf("%s%s",num1,num2);int i,sp=1;int len1=strlen(num1)-1,len2=strlen(num2)-1;if(len1>len2)ans=num1;elseans=num2;for(i=strlen(ans)-1;i>=0;i--){char temp1,temp2;if(len1<0)temp1='0';elsetemp1=num1[len1--];if(len2<0)temp2='0';elsetemp2=num2[len2--];if(sp){ans[i]=gotch(((temp1-'0')+(temp2-'0'))%13);sp=0;}else{ ans[i]=temp2-temp1;if(ans[i]<0)ans[i]+='0'+10;elseans[i]+='0';sp=1;}}printf("%s\n",ans);return EXIT_SUCCESS; }

天坑!題目并沒有說明白數字A可能比數字B長,測試點2和5就是數字A比數字B長的情況,這時需要短的數字補零。

顯而易見的做法是反轉字符串,然后把短的補零,再逐位計算。

。。然而我并不想寫reverse函數。

1.判斷哪個數字長,指針指向長的數字。

2.兩數字從個位開始逐位計算,如果有一個數字的索引 <0 則去值為 ‘0’ 。

3.輸出指針所指的字符串。


1049數列的片段和

#include<iostream> using namespace std; int main(int argc,char *argv[]) {int cnt;cin>>cnt;long double sum=0.0;for(int i=1;i<=cnt;++i){long double temp;cin>>temp;sum+=temp*i*(cnt+1-i);}printf("%.2Lf\n",sum);return 0; }

每個數出現的個數是(左邊數的個數+1)*(右邊數的個數+1)。


1050螺旋矩陣

#include<stdio.h> #include<stdlib.h> #include<math.h> int compare(const void *a,const void *b) {return -*(const int*)a+*(const int*)b; } int main(int argc,char **argv) {int cnt;scanf("%d",&cnt);int i,j,index=1;int *array=(int*)calloc(cnt+1,sizeof(int));for(i=1;i<=cnt;i++)scanf("%d",&array[i]);qsort(array+1,cnt,sizeof(int),compare); int n=(int)floor(sqrt(cnt)),m;while(cnt%n)n--;m=cnt/n;int **matrix=(int**)calloc(m+5,sizeof(int*));for(i=0;i<=m+5;i++)matrix[i]=(int*)calloc(n+5,sizeof(int));i=j=1;while(cnt>0){while(matrix[i][j]==0&&j<=n)matrix[i][j++]=array[index++],cnt--;j--,i++;while(matrix[i][j]==0&&i<=m)matrix[i++][j]=array[index++],cnt--;i--,j--;while(matrix[i][j]==0&&j>=1)matrix[i][j--]=array[index++],cnt--;j++,i--;while(matrix[i][j]==0&&i>=1)matrix[i--][j]=array[index++],cnt--;i++,j++;}for(i=1;i<=m;i++)for(j=1;j<=n;j++)printf("%d%c",matrix[i][j],j==n?'\n':' ');return EXIT_SUCCESS; }

free函數竟然會導致運行時錯誤。。肯能是PAT這里只能申請堆內存不能釋放??

沒有說明N的大小范圍,須動態申請內存空間。


1051復數乘法

#include<stdio.h> #include<stdlib.h> #include<math.h> //#define HOST int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifdouble R1,R2,P1,P2;scanf("%lf%lf%lf%lf",&R1,&P1,&R2,&P2);double t1=R1*cos(P1),r1=R1*sin(P1),t2=R2*cos(P2),r2=R2*sin(P2);double ans1=t1*t2-r1*r2;double ans2=t1*r2+t2*r1;if(ans1>-0.005&&ans1<0.0)ans1=0.0;if(ans2>-0.005&&ans2<0.0)ans2=0.0;printf("%.2lf%+.2lfi\n",ans1,ans2); return EXIT_SUCCESS; }

小坑。須注意 0.0 ~ -0.005 之間四舍五入成 -0.0 的問題,應是 +0.0 。


1052賣個萌

#include<stdio.h> #include<stdlib.h> #include<string.h> int get(char out[][10]) {char temp;int index=0,spdex=0;while((temp=getchar())!='\n'){if(temp=='['){index=0;while((temp=getchar())!=']')out[spdex][index++]=temp;out[spdex][index]=0;spdex++;}}return spdex; } int main(int argc,char **argv) {char shou[15][10]={0};char yan[15][10]={0};char kou[15][10]={0};int shoumax=get(shou);int yanmax=get(yan);int koumax=get(kou);int cnt; scanf("%d",&cnt);while(cnt--){int t1,t2,t3,t4,t5;scanf("%d%d%d%d%d",&t1,&t2,&t3,&t4,&t5);if((t1<1||t1>shoumax)||(t2<1||t2>yanmax)||(t3<1||t3>koumax)||(t4<1||t4>yanmax)||(t5<1||t5>shoumax)){printf("Are you kidding me? @\\/@\n");continue;}printf("%s",shou[t1-1]);putchar('(');printf("%s",yan[t2-1]);printf("%s",kou[t3-1]);printf("%s",yan[t4-1]);putchar(')');printf("%s",shou[t5-1]);putchar('\n');}return EXIT_SUCCESS; }

小坑。不知道是不是編碼類型不對,在筆記本上運行讀取不了貌似是日語的字符。一開始用掃描集讀取一行也失敗了,失敗原因應該就是日語字符讀取失敗直接退出了。


1053住房空置率

#include<stdio.h> #include<stdlib.h> int main(int argc,char **argv) {int cnt,lday; double limit;scanf("%d%lf%d",&cnt,&limit,&lday);int maybe=0,able=0;for(int j=0;j<cnt;j++){int cnts,mb=0;double input;scanf("%d",&cnts);for(int i=0;i<cnts;i++){scanf("%lf",&input);if(input<limit)mb++;}if(mb>(cnts/2)){if(cnts>lday)able++;elsemaybe++;}}printf("%.1lf%% %.1lf%%\n",(double)maybe/cnt*100.0,(double)able/cnt*100.0);return EXIT_SUCCESS; }

坑!題目中說的是“?若觀察期超過某給定閾值 ”,并不是低于電量低于某給定的閾值e的天數…

看題的時候想當然了,理解錯的話測試點1,2就會過不去。


1054求平均值

#include<stdio.h> #include<ctype.h> #include<stdlib.h> #include<stdbool.h> #include<math.h> bool check(char *s) {int i=0;if(s[0]=='-')i++;for(;s[i]&&s[i]!='.';i++)if(!isdigit(s[i]))return false; if(s[i]=='.')for(int j=i+1;s[j];j++)if(!isdigit(s[j])||j-i>2)return false; double temp=fabs(atof(s));if(temp>1000.0)return false;return true; } int main(int argc,char **argv) {int cnt;scanf("%d",&cnt);int ins=0;double sum=0.0;while(cnt--){char str[100]={0};scanf("%s",str);if(check(str)){ins++;sum+=atof(str);}elseprintf("ERROR: %s is not a legal number\n",str);}if(ins){if(ins==1)printf("The average of 1 number is %.2lf\n",sum);elseprintf("The average of %d numbers is %.2f\n",ins,sum/ins);}elseprintf("The average of 0 numbers is Undefined\n");return EXIT_SUCCESS; }

一上來就想用個sscanf騷操作。。一番操作浪費了一個多小時……

然后老老實實的先判斷再 atof(str) 了。。。


1055集體照

#include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct {char name[10];int high; }student; int compare(const void *a,const void *b) {const student *sa=a;const student *sb=b;if(sa->high==sb->high)return strcmp(sa->name,sb->name);elsereturn sb->high-sa->high; } int main(int argc,char **argv) {int cnt,row;scanf("%d%d",&cnt,&row);int div=cnt/row,column=cnt%div+div;student class[10005];for(int i=0;i<cnt;i++)scanf("%s%d",class[i].name,&class[i].high);qsort(class,cnt,sizeof(student),compare);int temp[100005]={0},sum=1,index=0;temp[column/2+1]=index++;for(int i=1;;i++){if(sum>=column)break;temp[column/2+1-i]=index++;sum++;if(sum>=column)break;temp[column/2+1+i]=index++;sum++;}for(int i=1;i<=column;i++)printf("%s%c",class[temp[i]].name,i==column?'\n':' ');for(int i=row-1;i>=1;i--){sum=1;temp[div/2+1]=index++;int offset=1; while(1){if(sum>=div)break;temp[div/2+1-offset]=index++;sum++;if(sum>=div)break;temp[div/2+1+offset]=index++;sum++;offset++;}for(int j=1;j<=div;j++)printf("%s%c",class[temp[j]].name,j==div?'\n':' ');}return EXIT_SUCCESS; }

從高到低+字典序升序排列后,每一行安排好對應位置的編號,再依次輸出即可。


1056組合數的和

#include<stdio.h> #include<stdlib.h> int main(int argc,char **argv) {int cnt; scanf("%d",&cnt);int array[10]={0};for(int i=0;i<cnt;i++)scanf("%d",&array[i]);int sum=0;for(int i=0;i<cnt;i++)for(int j=0;j<cnt;j++){if(i==j)continue;sum+=array[i]*10+array[j];}printf("%d\n",sum);return EXIT_SUCCESS; }

so so so so easy。


1057數零壹

#include<stdio.h> #include<stdlib.h> #include<string.h> #include<ctype.h> int main(int argc,char **argv) {char str[100005]={0};scanf("%[^\n]",str);unsigned int sum=0;for(int i=0;i<strlen(str);i++){if(isalpha(str[i])){char ch=tolower(str[i]);sum+=ch-'a'+1;}}int zero=0,one=0;while(sum){if(sum&1)one++;elsezero++;sum>>=1;}printf("%d %d\n",zero,one);return EXIT_SUCCESS; }

so so so so easy。


1058選擇題

#include<stdio.h> #include<stdlib.h> #include<string.h> //#define HOST typedef struct {int score;int anssum;int anscnt;char ans[6]; }subject; int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint cnt1,cnt2;scanf("%d%d",&cnt1,&cnt2);subject sp[105];for(int i=0;i<cnt2;i++){scanf("%d%d%d",&sp[i].score,&sp[i].anssum,&sp[i].anscnt);for(int j=0;j<sp[i].anscnt;j++)scanf("%*c%c",&sp[i].ans[j]);sp[i].ans[sp[i].anscnt]=0;}int book[105]={0},bookmax=0;while(cnt1--){int sum=0;for(int i=0;i<cnt2;i++){while(getchar()!='(');int xuan;char xuanans[6]={0};scanf("%d",&xuan);for(int j=0;j<xuan;j++)scanf("%*c%c",&xuanans[j]);getchar();if(xuan!=sp[i].anscnt||strcmp(xuanans,sp[i].ans)){book[i]++;if(book[i]>bookmax)bookmax=book[i];continue;}sum+=sp[i].score;}printf("%d\n",sum);}if(!bookmax)printf("Too simple\n");else{printf("%d",bookmax);for(int i=0;i<cnt2;i++)if(book[i]==bookmax)printf(" %d",i+1);putchar('\n');}return EXIT_SUCCESS; }

比對學生答案的字符串與標準字符串是否一致即可。


1059C語言競賽

#include<stdio.h> #include<stdlib.h> #include<stdbool.h> #include<math.h> //#define HOST bool check(int num) {int i;for(i=2;i<=(int)sqrt(num);i++)if(num%i==0)break;if(i>(int)sqrt(num))return true;return false; } int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint cnt,ID[10005]={0}; scanf("%d",&cnt);for(int i=1;i<=cnt;i++){int temp;scanf("%d",&temp);ID[temp]=i; }scanf("%d",&cnt);while(cnt--){int temp;scanf("%d",&temp);if(!ID[temp])printf("%04d: Are you kidding?\n",temp);else if(ID[temp]==-1)printf("%04d: Checked\n",temp);else{if(ID[temp]==1)printf("%04d: Mystery Award\n",temp);else if(check(ID[temp]))printf("%04d: Minion\n",temp);elseprintf("%04d: Chocolate\n",temp);ID[temp]=-1;}}return EXIT_SUCCESS; }

so easy。


1060愛丁頓數

#include<stdio.h> #include<stdlib.h> #include<stdbool.h> //#define HOST int compare(const void *a,const void *b) {return *(const int*)b-*(const int*)a; } int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint cnt; scanf("%d",&cnt);int array[100005];for(int i=0;i<cnt;i++)scanf("%d",&array[i]);qsort(array,cnt,sizeof(int),compare);int i;for(i=0;i<cnt;i++)if(array[i]<=i+1){printf("%d\n",i);break;}if(i==cnt)printf("%d\n",i);return EXIT_SUCCESS; }

遞減排序后,遍歷查找第一個不符合 array[i] > i+1 的位置輸出即可。不要忘記全都滿足的情況,測試點3就是此情況。


1061判斷題

#include<stdio.h> #include<stdlib.h> //#define HOST _Bool ans[105]; int score[105]={0}; int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint stnum,tinum;scanf("%d%d",&stnum,&tinum);for(int i=1;i<=tinum;i++)scanf("%d",&score[i]);for(int i=1;i<=tinum;i++)scanf("%hd",&ans[i]);while(stnum--){int temp,sum=0;for(int i=1;i<=tinum;i++){scanf("%d",&temp);if(temp==ans[i])sum+=score[i];}printf("%d\n",sum);}return EXIT_SUCCESS; }

so so so so easy。


1062最簡分數

#include<stdio.h> #include<stdlib.h> #include<math.h> #include<stdbool.h> //#define HOST int gcd(int m,int n) {return (m%n?(gcd(n,m%n)):(n)); } int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint zi1,zi2,mu1,mu2,aim;scanf("%d/%d",&zi1,&mu1);scanf("%d/%d",&zi2,&mu2);scanf("%d",&aim);double qzi1=(zi1*((double)aim/(double)mu1));double qzi2=(zi2*((double)aim/(double)mu2));if(qzi1>qzi2){double temp=qzi1;qzi1=qzi2;qzi2=temp;}zi1=(int)floor(qzi1);zi2=(int)ceil(qzi2);bool ok=false;for(int i=zi1+1;i<zi2;i++){int temp=gcd(i,aim);if(temp==1)if(ok==false)printf("%d/%d",i,aim),ok=true;elseprintf(" %d/%d",i,aim);}putchar('\n');return EXIT_SUCCESS; }

小坑。注意是兩分數之間,并不包括兩分數。


1063計算譜半徑

#include<stdio.h> #include<stdlib.h> #include<math.h> //#define HOST int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint cnt,a,b;double maxp=0.0;scanf("%d",&cnt);while(cnt--){scanf("%d%d",&a,&b);double temp=sqrt(a*a+b*b);if(temp>maxp)maxp=temp; }printf("%.2lf\n",maxp);return EXIT_SUCCESS; }

so so so so easy。


1064朋友數

#include<stdio.h> #include<stdlib.h> #include<stdbool.h> //#define HOST int getsum(int num) {int sum=0;while(num){sum+=num%10;num/=10;}return sum; } int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint cnt,ind=0;scanf("%d",&cnt);bool sp[50]={false};while(cnt--){int temp;scanf("%d",&temp);temp=getsum(temp);if(sp[temp]==false){sp[temp]=true;ind++;}}printf("%d\n",ind);bool ok=false;for(int i=0;i<50;i++)if(sp[i])if(ok==false)printf("%d",i),ok=true;elseprintf(" %d",i);putchar('\n');return EXIT_SUCCESS; }

so so so so easy。


1065單身狗

#include<stdio.h> #include<stdlib.h> #include<stdbool.h> //#define HOST int couple[1000000]={0}; int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint cnt,sum=0;scanf("%d",&cnt);while(cnt--){int a,b;scanf("%d%d",&a,&b);couple[a]=b+1;couple[b]=a+1;}scanf("%d",&cnt);while(cnt--){int temp;scanf("%d",&temp);if(couple[temp]>0)couple[temp]=0;elsecouple[temp]=-1,sum++;}for(int i=0;i<=99999;i++)if(couple[i]>0&&couple[couple[i]-1]==0)couple[couple[i]-1]=-1,sum++;bool ok=false;printf("%d\n",sum);for(int i=0;i<=99999;i++)if(couple[i]==-1)if(ok==false)printf("%05d",i),ok=true;elseprintf(" %05d",i);return EXIT_SUCCESS; }

微坑。一個單身狗都沒有時,單身狗ID行應為空,所以不能在末尾加回車。


1066圖像過濾

#include<stdio.h> #include<stdlib.h> //#define HOST int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint m,n,left,right,replace;scanf("%d%d%d%d%d",&m,&n,&left,&right,&replace);for(int i=0;i<m;i++)for(int j=0;j<n;j++){int temp;scanf("%d",&temp);if(temp>=left&&temp<=right)temp=replace;printf("%03d%c",temp,j==n-1?'\n':' ');}return EXIT_SUCCESS; }

so so so so easy。


1067試密碼

#include<stdio.h> #include<stdlib.h> #include<string.h> //#define HOST int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint cnt;char ans[25]={0};scanf("%s",ans);scanf("%d",&cnt);while(cnt){char temp[250]={0};scanf("%*c%[^\n]",temp);if(temp[0]=='#'&&strlen(temp)==1)break;if(!strcmp(ans,temp)){printf("Welcome in\n");break;}printf("Wrong password: %s\n",temp);cnt--;}if(!cnt)printf("Account locked\n");return EXIT_SUCCESS; }

坑。有幾個需要注意的地方:1.用戶嘗試輸入的密碼大小不確定,稍微開大點;2.用戶嘗試輸入的密碼會包含空白字符;3.輸入只有 ‘ # ’ 的時候退出……不能之判斷第一個字符。


1068萬綠叢中一點紅

#include<stdio.h> #include<stdlib.h> #include<stdbool.h> //#define HOST int m,n,limit; int matrix[1005][1005]={0}; bool check(int i,int j) {const int move[8][2]={{-1,-1},{-1,0},{-1,1},{1,-1},{1,0},{1,1},{0,-1},{0,1}};for(int k=0;k<8;k++){int tx=move[k][0]+i;int ty=move[k][1]+j;if(ty<0||ty>=n||tx<0||tx>=m)continue;if(abs(matrix[tx][ty]-matrix[i][j])<=limit)return false;}return true; } bool unique(int num,int x0,int y0) {for(int i=0;i<m;i++)for(int j=0;j<n;j++){if(i==x0&&j==y0)continue;if(matrix[i][j]==num)return false;}return true; } int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifscanf("%d%d%d",&n,&m,&limit);for(int i=0;i<m;i++)for(int j=0;j<n;j++)scanf("%d",&matrix[i][j]);int sum=0,spi,spj;for(int i=0;i<m;i++)for(int j=0;j<n;j++)if(check(i,j)&&unique(matrix[i][j],i,j))sum++,spi=i,spj=j;if(sum==0)printf("Not Exist\n");else if(sum>1)printf("Not Unique\n");elseprintf("(%d, %d): %d\n",spj+1,spi+1,matrix[spi][spj]);return EXIT_SUCCESS; }

沒有C++的map容器,又開不了那么大的數組,只能挨個確定唯一性,好在數據并不大。先確認差值符合再確定唯一性會快一些。


1069微博轉發抽獎

#include<stdio.h> #include<stdlib.h> #include<stdbool.h> #include<string.h> //#define HOST char queue[1005][25]={0}; int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint cnt,jump,begin,sp=0;scanf("%d%d%d",&cnt,&jump,&begin);for(int i=1;i<=cnt;i++){char temp[25]={0};scanf("%s",temp);if(i==begin){bool go=false;for(int j=0;j<sp;j++)if(!strcmp(temp,queue[j])){begin++;go=true;break;}if(go)continue;begin+=jump;printf("%s\n",temp);strcpy(queue[sp++],temp);}}if(!sp)printf("Keep going...\n");return EXIT_SUCCESS; }

so easy。


1070結繩

#include<stdio.h> #include<stdlib.h> //#define HOST int compare(const void *a,const void *b) {return *(const int*)a-*(const int*)b; } int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint cnt; scanf("%d",&cnt);int array[10005]={0};for(int i=1;i<=cnt;i++)scanf("%d",&array[i]);qsort(array+1,cnt,sizeof(int),compare);double lenth=(double)array[1];for(int i=2;i<=cnt;i++)lenth=lenth/2.0+array[i]/2.0;printf("%d\n",(int)lenth);return EXIT_SUCCESS; }

想要取到所有繩子的最大長度,要保證最長的繩子減半的次數最少。排序后計算便是。


1071小賭怡情

#include<stdio.h> #include<stdlib.h> //#define HOST int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint all,cnt;scanf("%d%d",&all,&cnt);while(cnt--){int a,b,sp,push;scanf("%d%d%d%d",&a,&sp,&push,&b);if(push>all){printf("Not enough tokens. Total = %d.\n",all);continue;}if((!sp&&a>b)||(sp&&a<b)){all+=push;printf("Win %d! Total = %d.\n",push,all);}if((sp&&a>b)||(!sp&&a<b)){all-=push;printf("Lose %d. Total = %d.\n",push,all);}if(all<=0){printf("Game Over.\n");break;}}return EXIT_SUCCESS; }

so so easy。


1072開學寄語

#include<stdio.h> #include<stdlib.h> #include<stdbool.h> //#define HOST int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint cnt,items; scanf("%d%d",&cnt,&items);bool item[10000]={false};while(items--){int temp;scanf("%d",&temp);item[temp]=true;}int stu=0,goods=0;while(cnt--){char name[10]={0};int index,book[10]={0},z=0;scanf("%s%d",name,&index);while(index--){int temp;scanf("%d",&temp);if(item[temp]){book[z++]=temp;goods++;}}if(z){stu++;printf("%s:",name);for(int i=0;i<z;i++)printf(" %04d",book[i]);putchar('\n');}}printf("%d %d\n",stu,goods);return EXIT_SUCCESS; }

so so easy。


1073多選題常見計分法

#include<stdio.h> #include<stdlib.h> #include<string.h> #include<stdbool.h> #define Max(a,b) (a>b?(a):(b)) //#define HOST typedef struct {int score;int anssum;int anscnt;bool ans[6]; }subject; int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint cnt1,cnt2;scanf("%d%d",&cnt1,&cnt2);subject sp[105];for(int i=0;i<cnt2;i++){scanf("%d%d%d",&sp[i].score,&sp[i].anssum,&sp[i].anscnt);for(int j=0;j<sp[i].anssum;j++)sp[i].ans[j]=false;for(int j=0;j<sp[i].anscnt;j++){char temp;scanf("%*c%c",&temp);sp[i].ans[temp-'a']=true;}}int book[105][6]={0},bookmax=0;while(cnt1--){double sum=0.0;for(int i=0;i<cnt2;i++){while(getchar()!='(');int xuan;char xuanans[6]={0};bool zero=false;scanf("%d",&xuan);for(int j=0;j<sp[i].anssum;j++)if(sp[i].ans[j]==true)book[i][j]++;for(int j=0;j<xuan;j++){char temp;scanf("%*c%c",&temp);if(sp[i].ans[temp-'a']==true)book[i][temp-'a']--;else{zero=true;book[i][temp-'a']++;}}getchar();if(xuan==sp[i].anscnt&&zero==false)sum+=(double)sp[i].score;else if(xuan!=sp[i].anscnt&&zero==false)sum+=(double)sp[i].score/2.0;}printf("%.1lf\n",sum);}for(int i=0;i<cnt2;i++)for(int j=0;j<6;j++)bookmax=Max(bookmax,book[i][j]);if(!bookmax)printf("Too simple\n");else{for(int i=0;i<cnt2;i++)for(int j=0;j<6;j++)if(book[i][j]==bookmax)printf("%d %d-%c\n",bookmax,i+1,j+'a');}return EXIT_SUCCESS; }

一道很麻煩的模擬題,由 1058 改編而成。需注意錯題不單單是錯誤的選項,對的選項沒選也算錯誤。


1074宇宙無敵加法器

#include<stdio.h> #include<stdlib.h> #include<string.h> //#define HOST int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifchar biao[20]={0};char biga[20]={0};char bigb[20]={0};char ans[50]={0};scanf("%s%s%s",biao,biga,bigb);int lenbiao=strlen(biao),lena=strlen(biga),lenb=strlen(bigb);int index=0;while(index<lena||index<lenb){int a,b,c;if(index>=lena)a=0;elsea=biga[lena-index-1]-'0';if(index>=lenb)b=0;elseb=bigb[lenb-index-1]-'0';if(biao[lenbiao-index-1]=='0')c=10;elsec=biao[lenbiao-index-1]-'0';ans[index]+=a+b;if(ans[index]>=c){ans[index]-=c;ans[index+1]++;}ans[index++]+='0';}if(ans[index])ans[index]+='0';elseindex--;while(ans[index]=='0')index--;for(int i=index;i>=0;i--)putchar(ans[i]);if(index<0)putchar('0'); putchar('\n');return EXIT_SUCCESS; }

小坑。結果是 0 的時候確保輸出一個 0 。


1075鏈表元素分類

#include<stdio.h> #include<stdlib.h> #include<stdbool.h> //#define HOST struct {int data,next; }node[100005]; int arr[100005][3]={0}; int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint st,n,k,ip;scanf("%d%d%d",&st,&n,&k);for(int i=0;i<n;i++){scanf("%d",&ip);scanf("%d%d",&node[ip].data,&node[ip].next);}int point=st,index[3]={0};while(point!=-1){int data=node[point].data;if(data<0)arr[index[0]++][0]=point;else if(data>=0&&data<=k)arr[index[1]++][1]=point;elsearr[index[2]++][2]=point;point=node[point].next;}bool fb=true;for(int i=0;i<3;i++){for(int j=0;j<index[i];j++){if(fb){printf("%05d %d ",arr[j][i],node[arr[j][i]].data);fb=false;}elseprintf("%05d\n%05d %d ",arr[j][i],arr[j][i],node[arr[j][i]].data); }}printf("-1");return EXIT_SUCCESS; }

存儲鏈表后,從鏈表頭開始遍歷依次存下 <0、0<=&&<=k、>k 的地址。

按上面的順序依次輸出地址和數據。


1076Wifi密碼

#include<stdio.h> #include<stdlib.h> #include<ctype.h> int main(int argc,char **argv) {int cnt,ins;scanf("%d",&cnt);int ans[105]={0};for(ins=0;ins<cnt;ins++){char alpha,is='F';while(is!='T')scanf("%*c%c-%c",&alpha,&is);ans[ins]=alpha-'A'+1;}for(cnt=0;cnt<ins;cnt++)putchar('0'+ans[cnt]);putchar('\n');return EXIT_SUCCESS;}

so so so easy。


1077互評成績計算

#include<stdio.h> #include<stdlib.h> #include<math.h> #define Max(a,b) (a<b?(b):(a)) #define Min(a,b) (a<b?(a):(b)) //#define HOST int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint cnt,maxs;scanf("%d%d",&cnt,&maxs);for(int i=1;i<=cnt;i++){int teacher,max=0,min=1<<30,sum=0,div=cnt-3;scanf("%d",&teacher);for(int j=1;j<cnt;j++){int temp;scanf("%d",&temp);if(temp<0||temp>maxs){div--;continue;}sum+=temp;max=Max(max,temp);min=Min(min,temp);}sum-=max;sum-=min;sum=(int)round(((double)sum/div+(double)teacher)/2.0);printf("%d\n",sum);}return EXIT_SUCCESS; }

so so so easy。


1078字符串壓縮與解壓

#include<stdio.h> #include<stdlib.h> #include<stdbool.h> #include<string.h> #include<ctype.h> //#define HOST void ya(char *str) {int i=0,len=strlen(str),nowlen=0;char sp=str[0];while(i<len){if(sp==str[i]){nowlen++;}else{if(nowlen>1)printf("%d",nowlen);putchar(sp);nowlen=1;sp=str[i];}i++;}if(nowlen>1)printf("%d",nowlen);putchar(sp);return; } void jie(char *str) {int i=0,len=strlen(str);char sp,temp;while(i<len){sp=str[i];if(isdigit(sp)){i++;int num=sp-'0';while(isdigit(str[i])){num=num*10+str[i]-'0';i++;}temp=str[i];for(int k=1;k<=num;k++)putchar(temp);}elseputchar(sp);i++;}return; } int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifchar ch,str[1005]={0};ch=getchar();scanf("%*c%[^\n]%*c",str);if(ch=='C')ya(str);elsejie(str);putchar('\n');return EXIT_SUCCESS; }

so so easy。上學期ACM校賽的一個簽到題。


1079延遲的回文數

#include<stdio.h> #include<stdlib.h> #include<stdbool.h> #include<string.h> //#define HOST bool check(char *num) {int left=0,right=strlen(num)-1;while(left<right){if(num[left]!=num[right])return false;left++;right--;}return true; } char* transform(char *num) {static char spnum[1200]={0};int left=0,right=strlen(num)-1,index=0;for(int i=right;i>=left;i--)spnum[index++]=num[i];return spnum; } char* Bigadd(char *num1,char *num2) {int len=strlen(num1),i,j;static char sumnum[1200]={0};memset(sumnum,0,sizeof(sumnum));for(i=len;i>0;i--){sumnum[i]+=num1[i-1]+num2[i-1]-2*'0';if(sumnum[i]>=10){sumnum[i-1]++;sumnum[i]-=10;}}if(sumnum[0])i=1;for(j=0;j<=len;j++)sumnum[j]+='0';sumnum[j]=0;//printf(">>>%s %d\n",sumnum,i);if(!i)return (sumnum+1);return sumnum; } int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint cnt=10;char num[1200]={0};scanf("%s",num);if(check(num))printf("%s is a palindromic number.\n",num);else{ while(cnt--){char *temp1=transform(num); char *temp2=Bigadd(num,temp1);printf("%s + %s = %s\n",num,temp1,temp2);strcpy(num,temp2);if(check(temp2))break;}if(cnt>-1)printf("%s is a palindromic number.\n",num);elseprintf("Not found in 10 iterations.\n");}return EXIT_SUCCESS; }

大整數高精度運算這塊總是寫的很麻煩。。重復的翻轉總怕出錯。


1080MOOC期終成績

#include<stdio.h> #include<stdlib.h> #include<stdbool.h> #include<string.h> #include<math.h> //#define HOST typedef struct {char name[25];int sum,gp,gm,gf; }student; typedef struct {char name[25];int gnum; }studentcopy; student sp[10005]={0}; studentcopy sp2[10005]={0},sp3[10005]={0}; void getsp(int cnt1,int cnt2,int cnt3) {int ks=0,ls=0;for(int i=0;i<cnt1;i++){while(strcmp(sp[i].name,sp2[ks].name)>0&&ks<cnt2)ks++;while(strcmp(sp[i].name,sp3[ls].name)>0&&ls<cnt3)ls++;sp[i].gm=-1;if(strcmp(sp[i].name,sp2[ks].name)==0)sp[i].gm=sp2[ks].gnum;if(strcmp(sp[i].name,sp3[ls].name)==0)sp[i].gf=sp3[ls].gnum;if(sp[i].gm>sp[i].gf)sp[i].sum=(int)round(0.4*sp[i].gm+0.6*sp[i].gf);elsesp[i].sum=sp[i].gf;} } int compare(const void *a,const void *b) {const student *sa=(const student*)a;const student *sb=(const student*)b;if(sa->sum==sb->sum)return strcmp(sa->name,sb->name);return sb->sum-sa->sum; } int comforsp(const void *a,const void *b) {const student *sa=(const student*)a;const student *sb=(const student*)b;return strcmp(sa->name,sb->name); } int comforcopy(const void *a,const void *b) {const studentcopy *sa=(const studentcopy*)a;const studentcopy *sb=(const studentcopy*)b;return strcmp(sa->name,sb->name); } int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint cnt1,cnt2,cnt3;scanf("%d%d%d",&cnt1,&cnt2,&cnt3);char str[25]={0};int index1=0,index2=0,index3=0;while(cnt1--){int temp;scanf("%s%d",sp[index1].name,&temp);if(temp>=200)sp[index1++].gp=temp;}while(cnt2--){scanf("%s%d",sp2[index2].name,&sp2[index2].gnum);index2++;}while(cnt3--){scanf("%s%d",sp3[index3].name,&sp3[index3].gnum);index3++;}qsort(sp,index1,sizeof(student),comforsp);qsort(sp2,index2,sizeof(studentcopy),comforcopy);qsort(sp3,index3,sizeof(studentcopy),comforcopy);getsp(index1,index2,index3);qsort(sp,index1,sizeof(student),compare);for(int i=0;i<index1;i++){if(sp[i].sum>=60){printf("%s",sp[i].name);printf(" %d",sp[i].gp);if(sp[i].gm!=-1)printf(" %d",sp[i].gm);elseprintf(" -1");printf(" %d",sp[i].gf);printf(" %d\n",sp[i].sum);}}return EXIT_SUCCESS; }

坑坑坑坑坑坑坑坑坑坑!!!坑到爆炸!

純C處理這種大規模可重復數據真的是太麻煩了,直接線性搜索名稱最后一個測試點穩穩地超時。

解決方法是多開兩個結構體數組用來存儲期中、期末考試成績,以 >=200分 的上機成績作為參考,排序三個成績的名稱后,按順序補全作為結果的結構體數組中的期中、期末成績。

我的想法是找到同名的就把成績復制過去,沒成績的就是 0 ,最后輸出的時候過濾總成績 <60 分的,期中考試是 0 的輸出 -1 就是了。

結果。。最后一個測試點一直是WA??折騰了老一番,怎么改都不對。。

吃了頓飯冷靜了下,發現期中考試會有家伙參加考試,然后考了個 0 分的。。。

2333,長教訓了,算是自己邏輯不周吧。。

另>>:做出來竟然比用STL庫 map 快。


1081檢查密碼

#include<stdio.h> #include<stdlib.h> #include<ctype.h> #include<string.h> int main(int argc,char **argv) {int cnt,inx;scanf("%d",&cnt);while(cnt--){char str[100]={0};scanf("%*c%[^\n]",str);if(strlen(str)<6){printf("Your password is tai duan le.\n");continue;}int h1=0,h2=0,flag=0;for(inx=0;inx<strlen(str);inx++){if(!(isalnum(str[inx])||str[inx]=='.')){printf("Your password is tai luan le.\n");flag=1;break;}if(isalpha(str[inx]))h1=1;if(isdigit(str[inx]))h2=1; }if(flag)continue;if(h1==0&&h2==1)printf("Your password needs zi mu.\n");if(h2==0&&h1==1)printf("Your password needs shu zi.\n");if(h1==1&&h2==1)printf("Your password is wan mei.\n");}return EXIT_SUCCESS; }

小坑,密碼串可能有空格。


1082射擊比賽

#include<stdio.h> #include<stdlib.h> #include<stdint.h> #define HOST int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint cnt; scanf("%d",&cnt);int bestID,worseID,bs=INT32_MAX,ws=0;while(cnt--){int temp,x,y;scanf("%d%d%d",&temp,&x,&y);x=x*x+y*y;if(x>ws){ws=x;worseID=temp;}if(x<bs){bs=x;bestID=temp;}} printf("%04d %04d\n",bestID,worseID); return EXIT_SUCCESS; }

so so so so easy。


1083是否存在相等的差

#include<stdio.h> #include<stdlib.h> //#define HOST int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint cnt,arr[10005]={0}; scanf("%d",&cnt);for(int i=1;i<=cnt;i++){int temp;scanf("%d",&temp);arr[abs(temp-i)]++;}for(int i=10000;i>=0;i--)if(arr[i]>1)printf("%d %d\n",i,arr[i]);return EXIT_SUCCESS; }

so so so so easy。


1084外觀數列

#include<stdio.h> #include<stdlib.h> #include<string.h> //#define HOST char* tran(char* arr,int len) {static char q[100000]={0};memset(q,0,sizeof(q));int index=0,isp=0,sp=0,take=arr[0];while(index<len){if(take==arr[index])sp++;else{q[isp++]=take;int left=isp,right=isp-1;while(sp){q[isp++]=sp%10+'0';sp/=10;right++;}while(left<right){int temp=q[left];q[left]=q[right];q[right]=temp;left++,right--;}take=arr[index];sp=1;}index++;}q[isp++]=take;int left=isp,right=isp-1;while(sp){q[isp++]=sp%10+'0';sp/=10;right++; }while(left<right){int temp=q[left];q[left]=q[right];q[right]=temp;left++,right--;}return q; } int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint cnt,k;char array[100000]={0};scanf("%d%d",&cnt,&k);array[0]=cnt+'0';for(int i=1;i<k;i++){char *point=tran(array,strlen(array)); strcpy(array,point); //printf("%d>>%s\n",i+1,array);}printf("%s\n",array); return EXIT_SUCCESS; }

不能小看 N 最大只有 40 ,d=2 N=40 的時候,上萬位都打不住。


1085PAT單位排行

#include<stdio.h> #include<stdlib.h> #include<string.h> #include<ctype.h> #include<math.h> //#define HOST typedef struct {char isp;double score;char name[20];int stnum,iscore; }unit; unit sp[100005]={0},ans[100005]={0}; int namecompare(const void *a,const void *b) {const unit *sa=(const unit*)a;const unit *sb=(const unit*)b;return strcmp(sa->name,sb->name); } int anscompare(const void *a,const void *b) {const unit *sa=(const unit*)a;const unit *sb=(const unit*)b;if(sa->iscore==sb->iscore){if(sa->stnum==sb->stnum)return strcmp(sa->name,sb->name);return sa->stnum-sb->stnum;}return sb->iscore-sa->iscore; } void ges(char mode,double *to,double *from) {if(mode=='T')*to+=*from*1.5;if(mode=='A')*to+=*from;if(mode=='B')*to+=*from/1.5;return; } int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint cnt,index=0; scanf("%d",&cnt);while(cnt--){char ch,temp[10]={0};while((ch=getchar())=='\n');sp[index].isp=ch;scanf("%*s");scanf("%lf",&sp[index].score);scanf("%s",temp);for(int i=0;i<strlen(temp);i++)temp[i]=tolower(temp[i]);strcpy(sp[index].name,temp);index++;}qsort(sp,index,sizeof(unit),namecompare);int ind=0,jnd=0;while(jnd<index){strcpy(ans[ind].name,sp[jnd].name);ans[ind].stnum=1;ges(sp[jnd].isp,&ans[ind].score,&sp[jnd].score);ind++,jnd++;int cut=1;while(jnd<index&&(!strcmp(ans[ind-cut].name,sp[jnd].name))){ans[ind-cut].stnum++;ges(sp[jnd].isp,&ans[ind-cut].score,&sp[jnd].score);jnd++;if(jnd>=index)break;}ans[ind-1].iscore=(int)floor(ans[ind-1].score);}qsort(ans,ind,sizeof(unit),anscompare);int qt=0,diff=-1,qr=1;printf("%d\n",ind);for(int i=0;i<ind;i++){if(diff!=ans[i].iscore){diff=ans[i].iscore; qt+=qr;qr=1;}elseqr++;printf("%d %s %d %d\n",qt,ans[i].name,ans[i].iscore,ans[i].stnum);}return EXIT_SUCCESS; }

C語言雞肋的時候到了,什么輔助數據結構也沒有,只能用結構體數組從頭構建。處理加權分數的時候最后轉成整形變量,后面的排序輸出會方便很多,還不會出莫名其妙的錯誤。


1086就不告訴你

#include<stdio.h> #include<stdlib.h> //#define HOST void print(int num) {while(num%10==0)num/=10;while(num){putchar(num%10+'0');num/=10;}putchar('\n');return; } int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint a,b;scanf("%d%d",&a,&b);print(a*b); return EXIT_SUCCESS; }

so so so so easy。


1087有多少不同的值

#include<stdio.h> #include<stdlib.h> #include<stdbool.h> //#define HOST int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint cnt,sum=0;int book[10400]={false};scanf("%d",&cnt);for(int i=1;i<=cnt;i++){int index=i/2+i/3+i/5;if(book[index]==false){sum++;book[index]=true;}}printf("%d\n",sum); return EXIT_SUCCESS; }

so so so so easy。


1088三人行

#include<stdio.h> #include<stdlib.h> #include<math.h> //#define HOST int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint my,x,y;scanf("%d%d%d",&my,&x,&y);for(int jia=99;jia>=10;jia--){int yi=jia%10*10+jia/10;double bing=(double)yi/(double)y;if(fabs(bing-(fabs((double)jia-(double)yi))/x)<1e-6){printf("%d",jia);if(jia>my)printf(" Cong");if(jia==my)printf(" Ping");if(jia<my)printf(" Gai");if(yi>my)printf(" Cong");if(yi==my)printf(" Ping");if(yi<my)printf(" Gai");if(bing>my)printf(" Cong\n");if(bing==my)printf(" Ping\n");if(bing<my)printf(" Gai\n");return EXIT_SUCCESS; }}printf("No Solution\n");return EXIT_SUCCESS; }

so easy。


1089狼人殺-簡單版

#include<stdio.h> #include<stdlib.h> #include<stdbool.h> #include<string.h> //#define HOST int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint cnt,index,book[105]={0},sp[105]={0},ans[105];bool get=true;scanf("%d",&cnt);for(int i=1;i<=cnt;i++)scanf("%d",&book[i]);for(int i=1;i<cnt;i++){for(int j=i+1;j<=cnt;j++){memset(sp,0,sizeof(sp));sp[i]=sp[j]=-1;ans[0]=ans[1]=0;index=0;for(int k=1;k<=cnt;k++){if((sp[abs(book[k])]==0&&book[k]<0)||(sp[book[k]]==-1&&book[k]>0))ans[index++]=k;}if(index==2&&(sp[ans[0]]==0&&sp[ans[1]]==-1||sp[ans[1]]==0&&sp[ans[0]]==-1)){printf("%d %d\n",i,j);get=false;break;}}if(get==false)break;}if(get)printf("No Solution\n");return EXIT_SUCCESS; }

枚舉法。先嘗試了下枚舉撒謊的,發現很難判斷是否正確的說出了狼人是哪兩個,折騰半天失敗告終…555…555…

枚舉狼人就很簡單了,誰說得和預設狼人不符,那么說的就是假話。再判斷下是不是只有一個狼人說了假話就是了。


1090危險品裝箱

#include<stdio.h> #include<stdlib.h> #include<stdbool.h> int sp[100000][105]={0}; int main(int argc,char **argv) {int cnt1,cnt2;scanf("%d%d",&cnt1,&cnt2);while(cnt1--){int a,b;scanf("%d%d",&a,&b);sp[a][sp[a][0]+1]=b;sp[a][0]++;}while(cnt2--){bool book[100000]={false};int array[10001]={0};int cnt,pass=0;scanf("%d",&cnt);int num=0;while(cnt--){scanf("%d",&array[num]);for(int index=1;index<=sp[array[num]][0];index++)book[sp[array[num]][index]]=true;num++;}for(int i=0;i<num;i++)if(book[array[i]])pass=1;if(pass)printf("No\n");elseprintf("Yes\n");}return EXIT_SUCCESS; }

用二維數組先存儲每個編號對應的若干個編號,sp[編號][0]存儲總共對應著幾個。

用布爾數組統計每個輸入的所有不相容編號,之后查詢如果有矛盾輸出No,否則Yes。

看了看其他人做的,大多用的STL容器,自己對STL庫的掌握還需要努力啊……


>>以下5題為2018/12/09PAT參賽時所寫


1091N-自守數

#include<stdio.h> #include<stdlib.h> #include<stdbool.h> #include<string.h> #include<math.h> bool check(long long a,int b) {int ts=0;if(b/10==0)ts=1;else if(b/100==0)ts=2;elsets=3;int isp=a%(int)pow(10,ts);if(isp==b)return true;return false; } int main(int argc,char **argv) {//freopen("test.txt","r",stdin);int cnt;scanf("%d",&cnt);while(cnt--){int temp;bool jump=false;scanf("%d",&temp);int i,j;for(i=1;i<10;i++){long long sp=(long long)i*temp*temp;if(check(sp,temp)){printf("%d %lld\n",i,sp);break;}}if(i==10)printf("No\n");}return EXIT_SUCCESS; }

so easy

1092最好吃的月餅

#include<stdio.h> #include<stdlib.h> #include<stdbool.h> int mat[1005]={0}; int max[1005]={0}; int maxmoon=0; int main(int argc, char *argv[]) {int cnt,city,sp=0;scanf("%d%d",&cnt,&city);int is,js,i;for(is=1;is<=city;is++){for(js=1;js<=cnt;js++){if(is==1)scanf("%d",&mat[js]);else{int temp;scanf("%d",&temp);mat[js]+=temp;}}}for(js=1;js<=cnt;js++){if(mat[js]>maxmoon){maxmoon=mat[js];sp=0;max[sp++]=js;}else if(mat[js]==maxmoon){max[sp++]=js;}}printf("%d\n",maxmoon);for(i=0;i<sp;i++)printf("%d%c",max[i],i==sp-1?'\n':' ');return 0; }

統計每個城市的和,取最大值遍歷。

1093字符串A+B

#include<stdio.h> #include<stdlib.h> #include<stdbool.h> #include<string.h> char str1[1000005]={0}; short int sp[128]={0}; char str2[1000005]={0}; int main(int argc, char *argv[]) {//freopen("test.txt","r",stdin);scanf("%[^\n]%*c",str1);scanf("%[^\n]%*c",str2);int i;for(i=0;i<strlen(str1);i++){int temp=str1[i];if(sp[temp]==0)sp[temp]=1;else if(sp[temp]==1)sp[temp]=2;}for(i=0;i<strlen(str2);i++){int temp=str2[i];if(sp[temp]==0)sp[temp]=1;else if(sp[temp]==1)sp[temp]=2;}for(i=0;i<strlen(str1);i++){int temp=str1[i];if(sp[temp]!=10){putchar(str1[i]);if(sp[temp]==2)sp[temp]=10;}}for(i=0;i<strlen(str2);i++){int temp=str2[i];if(sp[temp]!=10){putchar(str2[i]);if(sp[temp]==2)sp[temp]=10;}}putchar('\n');return 0; }

考試時寫的有點兒亂,循環里的變量都定義在了外面,怕不支持C99。

統計出現兩次的字符,這些字符只能打印一次。

1094谷歌的招聘

#include<stdio.h> #include<stdlib.h> #include<stdbool.h> #include<string.h> #include<math.h> int check(int num) {int i;if(num<2)return false;for(i=2;i<=(int)sqrt(num);i++){if(num%i==0)return false;}return true; } int getff(int num) {int i=0;while(num){num/=10;i++;}return i; } int main(int argc,char **argv) {//freopen("test.txt","r",stdin);int len,cnt;scanf("%d%d",&len,&cnt);char number[1005]={0};scanf("%s",number);int i,j;for(i=0;i<=len-cnt;i++){int temp=0;;for(j=0;j<cnt;j++){temp*=10;temp+=number[i+j]-'0';}if(check(temp)){int k;for(k=1;k<=cnt-getff(temp);k++)printf("0");printf("%d\n",temp);break;}}if(i==len-cnt+1)printf("404\n");return EXIT_SUCCESS; }

挨個取數字判斷是否為素數即可。

小坑,不要忘了題目中說的保留前導零。

1095解碼PAT準考證

#include<stdio.h> #include<stdlib.h> #include<stdbool.h> #include<string.h> typedef struct {char rank;int kid;int date;int mid;int score; }student; student sp[10005]={0}; int compare(const void *a,const void *b) {const student *sa=(const student*)a;const student *sb=(const student*)b;if(sa->score==sb->score){if(sa->rank==sb->rank){if(sa->kid==sb->kid){if(sa->date==sb->date){return sa->mid-sb->mid;}return sa->date-sb->date;}return sa->kid-sb->kid;}return sa->rank-sb->rank;}return sb->score-sa->score; } int main(int argc, char *argv[]) {//freopen("test.txt","r",stdin);int N,M;scanf("%d%d",&N,&M);int i;for(i=0;i<N;i++){char temp[20]={0};scanf("%s",temp);sscanf(temp,"%c%3d%6d%d",&sp[i].rank,&sp[i].kid,&sp[i].date,&sp[i].mid);scanf("%d",&sp[i].score);}qsort(sp,N,sizeof(student),compare);int j;for(j=1;j<=M;j++){int number,temp;char ctemp;scanf("%d",&number);switch(number){case 1:while((ctemp=getchar())==' ');printf("Case %d: %d %c\n",j,number,ctemp);{int i;bool isq=false;for(i=0;i<N;i++){if(sp[i].rank==ctemp){printf("%c%03d%06d%03d %d\n",sp[i].rank,sp[i].kid,sp[i].date,sp[i].mid,sp[i].score);isq=true; }}if(isq==false)printf("NA\n");}break;case 2:scanf("%d",&temp);printf("Case %d: %d %03d\n",j,number,temp);{int i,sumstu=0,sumscore=0;for(i=0;i<N;i++){if(sp[i].kid==temp){sumstu++;sumscore+=sp[i].score;}}if(!sumstu)printf("NA\n");elseprintf("%d %d\n",sumstu,sumscore);}break;case 3:scanf("%d",&temp);printf("Case %d: %d %06d\n",j,number,temp);{int i,ksp[1000]={0},max=0;bool isha=false;for(i=0;i<N;i++){if(sp[i].date==temp){isha=true;ksp[sp[i].kid]++;if(ksp[sp[i].kid]>max)max=ksp[sp[i].kid];}}for(i=max;i>0;i--){int j;for(j=101;j<=999;j++)if(ksp[j]==i){printf("%d %d\n",j,i);}}if(isha==false)printf("NA\n");}break;default:break;}}return 0; }

這次考試最麻煩的一道題,要求很多。

每個指令沒輸出都要輸出NA,所有前導零都不可省略。其他的正常來就是了。


END

總結

以上是生活随笔為你收集整理的PAT : PAT (Basic Level) Practice(中文)答案(1001 ~ 1095)(纯C编写)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。