20200604
pat乙真题2道
打印沙漏
链接:https://www.nowcoder.com/questionTerminal/5427d64b5dea499ba20906da72e12cfa
来源:牛客网
输入描述:
输入在一行给出1个正整数N(<=1000)和一个符号,中间以空格分隔。
输出描述:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
示例1
输入
19 +
输出
+++++
+++
+
+++
+++++
2
#include<stdio.h>
int main(void){
int n; //符号总数
char ch; //符号样式
int i,j;
int layer=0; //一半沙漏的层数
scanf("%d %c",&n,&ch);
while(n>=((layer+1)*(layer+1)*2-1)){
layer++; //由n判定层数
}
int rest=n-layer*layer*2+1;
for(i=0;i<layer;i++){ //上半沙漏
for(j=0;j<i;j++){ //打印空格
printf(" ");
}
for(j=0;j<=2*(layer-i-1);j++){
printf("%c",ch); //打印符号
}
printf("\n");
}
for(i=1;i<layer;i++){ //下半沙漏
for(j=0;j<layer-i-1;j++){
printf(" ");
}
for(j=0;j<2*(i+1)-1;j++)
printf("%c",ch);
printf("\n");
}
printf("%d",rest); //剩余符号数
return 0;
}
小结
没什么技巧可言,最麻烦的地方在于怎么控制打印数目。要提高准确度。
数字分类
链接:https://www.nowcoder.com/questionTerminal/473c219f9e4d4ab2851ed388895a9c86
来源:牛客网
每个输入包含1个测试用例。每个测试用例先给出一个不超过1000的正整数N,随后给出N个不超过1000的待分类的正整数。数字间以空格分隔。
A1 = 能被5整除的数字中所有偶数的和;
A2 = 将被5除后余1的数字按给出顺序进行交错求和,即计算n1-n2+n3-n4…;
A3 = 被5除后余2的数字的个数;
A4 = 被5除后余3的数字的平均数,精确到小数点后1位;
A5 = 被5除后余4的数字中最大数字。
输出描述:
对给定的N个正整数,按题目要求计算A1~A5并在一行中顺序输出。数字间以空格分隔,但行末不得有多余空格。
若其中某一类数字不存在,则在相应位置输出“N”。
示例1
输入
13 1 2 3 4 5 6 7 8 9 10 20 16 18
**输出
30 11 2 9.7 9
#include<stdio.h>
#define MAXSIZE 1000
int main(void){
int n;
scanf("%d",&n);
int a[MAXSIZE];
int Ans[5]={0};
int num2=1;
float num3=0.;
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
switch((a[i]%5)){
case 0:
if(a[i]%2==0)
Ans[0]+=a[i];
break;
case 1:
if(num2%2==1)
Ans[1]+=a[i];
else
Ans[1]-=a[i];
num2++;
break;
case 2:
Ans[2]++;
break;
case 3:
Ans[3]+=a[i];
num3+=1.;
break;
case 4:
if(a[i]>Ans[4])
Ans[4]=a[i];
}
}
for(int i=0;i<4;i++){
if(Ans[i]==0){
printf("N ");
}else{
switch(i){
case 3:
printf("%.1f ",Ans[i]/num3);
break;
default:
printf("%d ",Ans[i]);
}
}
}
if(Ans[4]!=0){
printf("%d\n",Ans[4]);
}else{
printf("N\n");
}
return 0;
}
小结
switch的括号,case的break,以及最后的N。
细心为上。
另注
这一题在pat官方并不能完全编译通过,最后一个测试点过不了,正在寻找问题。