题目集地址
报名了12月的PAT-B,先试试水。
已完成:2018/10/22 — 2018/11/14
更新:(2018/12/09)PAT乙级考试100分!
考试代码已更新
冬天坐火车跑去考试冻懵了,来年对战PAT甲级考试!

目录
目录
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;
else
num=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;
else
break;
if(str[i]=='A')
if(state==1)
state=2;
else if(state==2)
Amiddle++;
else if(state==0)
Afront++;
else
Alater++;
if(str[i]=='T')
if(state==2)
state=3;
else
break;
}
while(Amiddle)
{
Alater-=Afront;
Amiddle--;
}
if(i<strlen(str)||state!=3||Afront!=Alater)
printf("NO\n");
else
printf("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;
else
num=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;
else
putchar(' ');
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);
else
printf("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 ");
else
printf("%d ",A1);
if(A2els==0)
printf("N ");
else
printf("%d ",A2);
if(A3==0)
printf("N ");
else
printf("%d ",A3);
if(A4p==0.0)
printf("N ");
else
printf("%.1lf ",A4/A4p);
if(A5==0)
printf("N\n");
else
printf("%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");
else
printf(" ");
}
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);
else
return 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;
}
else
equ++;
}
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 HOST
freopen("input.txt","r",stdin);
#endif
int 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]);
else
putchar('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 HOST
freopen("input.txt","r",stdin);
#endif
int 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;
else
time=(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;
else
return x.day-y.day;
else
return x.month-y.month;
else
return 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);
else
printf("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;
else
sp=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;
else
putchar(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);
else
printf("%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;
else
break;
}
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 HOST
freopen("input.txt","r",stdin);
#endif
int 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('-');
else
abc=-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);
else
printf("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);
}
else
toearth(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;
else
ans=num2;
for(i=strlen(ans)-1;i>=0;i--)
{
char temp1,temp2;
if(len1<0)
temp1='0';
else
temp1=num1[len1--];
if(len2<0)
temp2='0';
else
temp2=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;
else
ans[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 HOST
freopen("input.txt","r",stdin);
#endif
double 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++;
else
maybe++;
}
}
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);
}
else
printf("ERROR: %s is not a legal number\n",str);
}
if(ins)
{
if(ins==1)
printf("The average of 1 number is %.2lf\n",sum);
else
printf("The average of %d numbers is %.2f\n",ins,sum/ins);
}
else
printf("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);
else
return 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++;
else
zero++;
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 HOST
freopen("input.txt","r",stdin);
#endif
int 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 HOST
freopen("input.txt","r",stdin);
#endif
int 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);
else
printf("%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 HOST
freopen("input.txt","r",stdin);
#endif
int 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 HOST
freopen("input.txt","r",stdin);
#endif
int 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 HOST
freopen("input.txt","r",stdin);
#endif
int 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;
else
printf(" %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 HOST
freopen("input.txt","r",stdin);
#endif
int 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 HOST
freopen("input.txt","r",stdin);
#endif
int 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;
else
printf(" %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 HOST
freopen("input.txt","r",stdin);
#endif
int 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;
else
couple[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;
else
printf(" %05d",i);
return EXIT_SUCCESS;
}
微坑。一个单身狗都没有时,单身狗ID行应为空,所以不能在末尾加回车。
1066图像过滤
#include<stdio.h>
#include<stdlib.h>
//#define HOST
int main(int argc,char **argv)
{
#ifdef HOST
freopen("input.txt","r",stdin);
#endif
int 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 HOST
freopen("input.txt","r",stdin);
#endif
int 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 HOST
freopen("input.txt","r",stdin);
#endif
scanf("%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");
else
printf("(%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 HOST
freopen("input.txt","r",stdin);
#endif
int 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 HOST
freopen("input.txt","r",stdin);
#endif
int 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 HOST
freopen("input.txt","r",stdin);
#endif
int 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 HOST
freopen("input.txt","r",stdin);
#endif
int 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 HOST
freopen("input.txt","r",stdin);
#endif
int 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 HOST
freopen("input.txt","r",stdin);
#endif
char 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;
else
a=biga[lena-index-1]-'0';
if(index>=lenb)
b=0;
else
b=bigb[lenb-index-1]-'0';
if(biao[lenbiao-index-1]=='0')
c=10;
else
c=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';
else
index--;
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 HOST
freopen("input.txt","r",stdin);
#endif
int 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;
else
arr[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;
}
else
printf("%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 HOST
freopen("input.txt","r",stdin);
#endif
int 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);
}
else
putchar(sp);
i++;
}
return;
}
int main(int argc,char **argv)
{
#ifdef HOST
freopen("input.txt","r",stdin);
#endif
char ch,str[1005]={0};
ch=getchar();
scanf("%*c%[^\n]%*c",str);
if(ch=='C')
ya(str);
else
jie(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 HOST
freopen("input.txt","r",stdin);
#endif
int 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);
else
printf("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);
else
sp[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 HOST
freopen("input.txt","r",stdin);
#endif
int 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);
else
printf(" -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 HOST
freopen("input.txt","r",stdin);
#endif
int 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 HOST
freopen("input.txt","r",stdin);
#endif
int 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 HOST
freopen("input.txt","r",stdin);
#endif
int 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 HOST
freopen("input.txt","r",stdin);
#endif
int 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;
}
else
qr++;
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 HOST
freopen("input.txt","r",stdin);
#endif
int 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 HOST
freopen("input.txt","r",stdin);
#endif
int 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 HOST
freopen("input.txt","r",stdin);
#endif
int 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 HOST
freopen("input.txt","r",stdin);
#endif
int 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");
else
printf("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;
else
ts=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");
else
printf("%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,所有前导零都不可省略。其他的正常来就是了。
本文分享了作者参加PAT-B级考试的经历,详细记录了备考过程、考试心得及满分经验。文中提供了多道题目的C语言实现代码,涵盖算法、数据结构、字符串处理等领域,适合准备参加PAT考试的同学参考学习。
472

被折叠的 条评论
为什么被折叠?



