PAT Basic Level Practice (中文)C语言
注:本文格式借鉴
Belous博客,因很长时间没有使用,代码格式并不规范,只能说在我自己提交时可以通过,如有问题请指正。
1001 害死人不偿命的(3n+1)猜想
题目地址
#include<stdio.h>
int main()
{
int i = 0,n;
scanf("%d",&n);
while(n != 1){
if(n%2 != 0) n = (3*n+1)/2;
else n = n/2;
i++;
}
printf("%d",i);
return 0;
}
根据奇偶来判断所要进行的运算,并在得到1时输出所需步骤数。‘
1002 写出这个数
题目地址
#include <stdio.h>
#define TURE 1
#define FALSE 0
int main(){
char num;
int sum=0,scanf_return;
while(TURE){
scanf_return=scanf("%c",&num);
if(num == '\n'&&scanf_return>=0) break;
sum += num - '0';
}
int zero_num=0;
for(int i = 100;i>=1;i/=10){
if(sum/i%10==0&&zero_num==0) continue;
zero_num++;
switch (sum/i%10){
case 0:printf("ling"); break;
case 1:printf("yi"); break;
case 2:printf("er"); break;
case 3:printf("san"); break;
case 4:printf("si"); break;
case 5:printf("wu"); break;
case 6:printf("liu"); break;
case 7:printf("qi"); break;
case 8:printf("ba"); break;
case 9:printf("jiu"); break;
}
if(i>1) printf(" ");
}
return 0;
}
先求各位相加的总和,再根据每一位输出对应的拼音。
1003 我要通过!
题目地址
#include <stdio.h>
#include <string.h>
int main(){
int num;
char str[100];
scanf("%d",&num);
for(int i = 1; i <=num;i++){
scanf("%s",str);
int state_p=0,state_t=0,p_a=0,a_a=0,t_a=0;
for(int j=0;j < strlen(str);j++){
if(str[j] == 'P') state_p++;
else if(str[j] == 'T') state_t++;
else if(str[j] == 'A'){
if(state_p == 0&&state_t == 0) p_a++;
else if(state_p == 1&&state_t == 0) a_a++;
else if(state_p == 1&&state_t == 1) t_a++;
}
else state_p = 10;
}
if(t_a == p_a * a_a&&state_p==1&&state_t==1&&a_a!=0) printf("YES");
else printf("NO");
if(i<num) printf("\n");
}
return 0;
}
因为一开始使用连续两个scanf读取字符,出现了回车存入缓存中占用字符的情况。虽然使用使用刷新缓存和在读取字符前加上空格符来跳过,但在PTA平台中都会编译超时,不知道是什么原因。后来改变策略使用字符串直接读取,成功解决。 规律:
- P和T出现并只出现1次
- T之后A的个数等于P之前A的个数和P于T之间A的个数的乘积
- P与T之间至少有一个A
1004 成绩排名
题目地址
#include <stdio.h>
#include <string.h>
int main(){
int num;
scanf("%d",&num);
char xingming[num][15],kecheng[num][15];
int chengji[num],temp_max = 0,temp_min = 0;
for(int i = 0;i < num;i++){
scanf("%s %s %d",&xingming[i],&kecheng[i],&chengji[i]);
if(chengji[i] > chengji[temp_max]) temp_max = i;
if(chengji[i] < chengji[temp_min]) temp_min = i;
}
printf("%s %s\n",xingming[temp_max],kecheng[temp_max]);
printf("%s %s",xingming[temp_min],kecheng[temp_min]);
return 0;
}
普通的比较大小然后输出。
1005 继续(3n+1)猜想
题目地址
#include <stdio.h>
int main(){
int num,group[100];
scanf("%d",&num);
int n = num;
for(int i = 0;i < num;i++){
scanf("%d",&group[i]);
}
for(int i = 0;i < num;i++){
int temp = group[i];
while(temp != 1&&temp != 0){
if(temp%2 != 0) temp = (3*temp+1)/2;
else temp = temp/2;
for(int j = 0;j < num;j++){
if(group[j] == temp){
group[j] = 0;
n--;
break;
}
}
}
}
int buf;
for(int i=0; i<num-1; i++){
for(int j=0; j<num-1-i; j++){
if(group[j] < group[j+1]){
buf = group[j];
group[j] = group[j+1];
group[j+1] = buf;
}
}
}
for(int i = 0;i < n;i++){
printf("%d",group[i]);
if(i != n-1) printf(" ");
}
return 0;
}
将出现的数字用零进行标记,再使用冒泡排序进行大小比较,最后输出。
1006 换个格式输出整数
题目地址
#include <stdio.h>
int main(){
int input;
scanf("%d",&input);
for(int i = input/100;i > 0;i--){
printf("B");
}
for(int i = input%100/10;i > 0;i--){
printf("S");
}
for(int i = 1;i <= input%10;i++){
printf("%d",i);
}
}
简单过头了。。。
# To Be Continued
|