报名了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
#include
#include
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。
#include
#include
#include
int main(int argc,char **argv)
{
char* bignumber=(char*)calloc(105,sizeof(char));
scanf("%s",bignumber);
int sum=0;
for(int i=0;i=0;i--)
printf("%s%c",sp[list[i]],i==0?'\n':' ');
return EXIT_SUCCESS;
}
so so easy。
#include
#include
#include
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
分析题目三个通过条件可知。字符串中不能出现P、A、T之外的字符;PT之间只有一个A时(PAT),前后可以加上相同个数的A;PT中每多一个A(>2),后面加上前面个数个A。
统计字符串中P、T前中后A的个数判断即可。
#include
#include
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
so so easy。
#include
#include
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左右。
#include
#include
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。
#include
#include
#include
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 。
#include
#include
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 。
#include
#include
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=0;ind--)
{
for(ins=book[ind][0];ins
记录每个单词的起始和终止位置。
#include
#include
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;
}
小小小坑。存在负指数。
#include
#include
#include
#define max(a,b) (ab?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……
#include
#include
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;
}
小小小坑,判断每一个情况是否有值。
#include
#include
#include
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,先打表,按要求依次输出。
#include
#include
#include
#include
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……。
#include
#include
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=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=c&&b
编写compare函数借助qsort即可,STL的sort同理。
#include
#include
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。提取符合的每一位相加。
#include
#include
#include
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;imod)
{
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 的情况。
#include
#include
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。统计输赢情况。
#include
#include
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的情况。
#include
#include
//#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->sisi)
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
小坑。第二行第三行输入的库存和总价题目说明是正数,可以是小数的。
#include
#include
#include
int main(int argc,char *argv[])
{
char bignumber[1005];
int book[10]={0};
scanf("%s",bignumber);
for(int i=0;i
so so so so easy。统计各个数字出现个数输出。
#include
#include
#include
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 的情况。
#include
#include
#include
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开始取最小数,后面的数从零开始取。
#include
#include
#include
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
先把输入处理成有效数字、正负号、指数值几部分,后根据指数正、负、零,分析输出即可。
#include
#include
//#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
读取链表数据,转换成数组存储。逐一反转数组即可。
#include
#include
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。得到程序运行秒数后,四舍五入成整数后按格式输出。
#include
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;
}
老题目,先计算好沙漏第一行字符个数和剩余值,循环输出即可。
#include
#include
#include
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 ),还需考虑只有一个满足的人的情况(最大最小输出同一个人的名字)。
#include
#include
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。
#include
#include
#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
排序后循环查找最大可能值。
#include
#include
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;
}
按所给计算方法判断是否通过。
#include
#include
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]
so easy。
#include
#include
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;
}
记录第一个字符串出现字符,过滤第二个字符串。
#include
#include
#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。分成两部分,一部分是直接计算分子、分母值及格式输出;另一部分是化简分子、分母为要求的格式。
#include
#include
//#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;ilen?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
考察插入排序和归并排序。一步一步进行插入/归并排序,如果出现与目标序列一致则输出排序种类,再进行一次对应排序后输出序列。
#include
#include
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。
#include
#include
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。单位转换。
#include
#include
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。
#include
#include
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;
}
根据第一个字符串统计第二个字符串,多出/缺少的字符数。
#include
#include
#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
#include
#include
#include
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。结构体数组存取。
#include
#include
#include
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;
}
将字母变成小写后,统计出现个数。逆序查找最大值。
#include
#include
#include
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,筛选输出。
#include
#include
#include
#include
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从字符串中读取可以简便许多。
#include
#include
int main(int argc,char **argv)
{
int cnt;
scanf("%d",&cnt);
int sp[100001][3],dp[100001];
for(int i=0;ileftmax)
leftmax=sp[i][0];
}
int rightmin=1<<30;
for(int i=cnt-1;i>=0;i--)
{
sp[i][2]=rightmin;
if(sp[i][0]=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
此题天坑!首先如果输入 0 的话,得到的输出应该是 0后面跟两个回车……测试点2就是输入为0。
其次,题目中说按递增顺序输出这些元素。意思是按原顺序输出,并不用递增排序。
于是跑一遍左侧最大值、右侧最小值,选择满足要求的输出就完事了……
#include
#include
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。
#include
#include
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。
#include
#include
#include
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.输出指针所指的字符串。
#include
#include
int main(int argc,char **argv)
{
int cnt;
scanf("%d",&cnt);
int i;
double sum=0.0,temp;
for(i=1;i<=cnt;i++)
{
scanf("%lf",&temp);
sum+=(double)(cnt-i+1)*(double)(i)*temp;
}
printf("%.2f\n",sum);
return EXIT_SUCCESS;
}
每个数出现的个数是(左边数的个数+1)*(右边数的个数+1)。
#include
#include
#include
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的大小范围,须动态申请内存空间。
#include
#include
#include
//#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 。
#include
#include
#include
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;
}
小坑。不知道是不是编码类型不对,在笔记本上运行读取不了貌似是日语的字符。一开始用扫描集读取一行也失败了,失败原因应该就是日语字符读取失败直接退出了。
#include
#include
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(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就会过不去。
#include
#include
#include
#include
#include
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) 了。。。
#include
#include
#include
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=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;
}
从高到低+字典序升序排列后,每一行安排好对应位置的编号,再依次输出即可。
#include
#include
int main(int argc,char **argv)
{
int cnt;
scanf("%d",&cnt);
int array[10]={0};
for(int i=0;i
so so so so easy。
#include
#include
#include
#include
int main(int argc,char **argv)
{
char str[100005]={0};
scanf("%[^\n]",str);
unsigned int sum=0;
for(int i=0;i>=1;
}
printf("%d %d\n",zero,one);
return EXIT_SUCCESS;
}
so so so so easy。
#include
#include
#include
//#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;ibookmax)
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
比对学生答案的字符串与标准字符串是否一致即可。
#include
#include
#include
#include
//#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。
#include
#include
#include
//#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
递减排序后,遍历查找第一个不符合 array[i] > i+1 的位置输出即可。不要忘记全都满足的情况,测试点3就是此情况。
#include
#include
//#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。
#include
#include
#include
#include
//#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
小坑。注意是两分数之间,并不包括两分数。
#include
#include
#include
//#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。
#include
#include
#include
//#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。
#include
#include
#include
//#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行应为空,所以不能在末尾加回车。
#include
#include
//#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=left&&temp<=right)
temp=replace;
printf("%03d%c",temp,j==n-1?'\n':' ');
}
return EXIT_SUCCESS;
}
so so so so easy。
#include
#include
#include
//#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.输入只有 ‘ # ’ 的时候退出……不能之判断第一个字符。
#include
#include
#include
//#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;i1)
printf("Not Unique\n");
else
printf("(%d, %d): %d\n",spj+1,spi+1,matrix[spi][spj]);
return EXIT_SUCCESS;
}
没有C++的map容器,又开不了那么大的数组,只能挨个确定唯一性,好在数据并不大。先确认差值符合再确定唯一性会快一些。
#include
#include
#include
#include
//#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
so easy。
#include
#include
//#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;
}
想要取到所有绳子的最大长度,要保证最长的绳子减半的次数最少。排序后计算便是。
#include
#include
//#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&&ab)||(!sp&&a
so so easy。
#include
#include
#include
//#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
so so easy。
#include
#include
#include
#include
#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
一道很麻烦的模拟题,由 1058 改编而成。需注意错题不单单是错误的选项,对的选项没选也算错误。
#include
#include
#include
//#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)
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 。
#include
#include
#include
//#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=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
存储链表后,从链表头开始遍历依次存下 <0、0<=&&<=k、>k 的地址。
按上面的顺序依次输出地址和数据。
#include
#include
#include
int main(int argc,char **argv)
{
int cnt,ins;
scanf("%d",&cnt);
int ans[105]={0};
for(ins=0;ins
so so so easy。
#include
#include
#include
#define Max(a,b) (amaxs)
{
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。
#include
#include
#include
#include
#include
//#define HOST
void ya(char *str)
{
int i=0,len=strlen(str),nowlen=0;
char sp=str[0];
while(i1)
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
so so easy。上学期ACM校赛的一个签到题。
#include
#include
#include
#include
//#define HOST
bool check(char *num)
{
int left=0,right=strlen(num)-1;
while(left=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;
}
大整数高精度运算这块总是写的很麻烦。。重复的翻转总怕出错。
#include
#include
#include
#include
#include
//#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;i0&&ks0&&lssp[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=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 快。
#include
#include
#include
#include
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
小坑,密码串可能有空格。
#include
#include
#include
#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
so so so so easy。
#include
#include
//#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。
#include
#include
#include
//#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>%s\n",i+1,array);
}
printf("%s\n",array);
return EXIT_SUCCESS;
}
不能小看 N 最大只有 40 ,d=2 N=40 的时候,上万位都打不住。
#include
#include
#include
#include
#include
//#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=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
C语言鸡肋的时候到了,什么辅助数据结构也没有,只能用结构体数组从头构建。处理加权分数的时候最后转成整形变量,后面的排序输出会方便很多,还不会出莫名其妙的错误。
#include
#include
//#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。
#include
#include
#include
//#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。
#include
#include
#include
//#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(jiamy)printf(" Cong");
if(yi==my)printf(" Ping");
if(yimy)printf(" Cong\n");
if(bing==my)printf(" Ping\n");
if(bing
so easy。
#include
#include
#include
#include
//#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;i0))
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…
枚举狼人就很简单了,谁说得和预设狼人不符,那么说的就是假话。再判断下是不是只有一个狼人说了假话就是了。
#include
#include
#include
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
用二维数组先存储每个编号对应的若干个编号,sp[编号][0]存储总共对应着几个。
用布尔数组统计每个输入的所有不相容编号,之后查询如果有矛盾输出No,否则Yes。
看了看其他人做的,大多用的STL容器,自己对STL库的掌握还需要努力啊……
#include
#include
#include
#include
#include
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
#include
#include
#include
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
统计每个城市的和,取最大值遍历。
#include
#include
#include
#include
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
考试时写的有点儿乱,循环里的变量都定义在了外面,怕不支持C99。
统计出现两次的字符,这些字符只能打印一次。
#include
#include
#include
#include
#include
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
挨个取数字判断是否为素数即可。
小坑,不要忘了题目中说的保留前导零。
#include
#include
#include
#include
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;imax)
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,所有前导零都不可省略。其他的正常来就是了。