题目链接:https://www.nowcoder.com/pat/6/problem/4078
做题思路:以次便遍历输入的数字,每个数字符合哪种情况就对应相应的运算法则。
学到的知识点:
- 1、三目运算符的运算法则(判断的语句)?true:false
- 2、局部变量在第51行报错,当我将他们分开试的时候发现max错了,原因max在这里是局部变量,当循环结束时就把max抛弃了再想去获取时就不能够获取到,只需要将它定义在前面就可以。
- 3、数交错相加只需要弄一个标志,将标志每一次变号就好
- 4、%.1f 数字一代表小数点后保留几位有效数字 ( %.f 四舍五入)
本题存在的bug:
- 样例13 代表一共有多少个数,并不是其中的一个数!这点初读题目非常纠结。
- sum2交错后有可能为0,但是这样也能够通过,最好设置另一个变量判断出现的次数,没有出现就一定w;
别人的代码:在牛客上通过,但是PTA上面有点小问题(看着挺舒服的,想学习一下)
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int c1=0,c2=0,c3=0,c4Num=0,c5=0;
float c4=0;
int n,x,i=1;
cin>>n;
while(n--)
{
cin>>x;
switch(x%5)
{
case 0:if(x%2==0) c1+=x; break;
case 1:c2+=(i*x);i=-i;break;
case 2:c3++;break;
case 3:c4+=x;c4Num++;break;
case 4:if(x>c5)c5=x;break;
}
}
(c1>0)?(cout<<c1<<" "):(cout<<"N ");
(c2!=0)?(cout<<c2<<" "):(cout<<"N ");
(c3>0)?(cout<<c3<<" "):(cout<<"N ");
(c4>0)?(cout<<fixed<<setprecision(1)<<c4/c4Num<<" "):(cout<<"N ");
(c5>0)?(cout<<c5):(cout<<"N");
return 0;
}
#include<stdio.h>
int main()
{
int T;
scanf("%d",&T);
int a[1010];
for(int i=0;i<T;i++)
{
scanf("%d",&a[i]);
}
int sum1,sum2,sum3,sum4,count;
sum1=sum2=sum3=sum4=count=0;
float average;
int max=a[0],flag=1;
int A1,A2,A3,A4,A5;
A1=A2=A3=A4=A5=0;
for(int i=0;i<T ;i++)
{
if(a[i]%10==0)
{
sum1+=a[i];
A1++;
}
else if(a[i]%5==1)
{
sum2=sum2+flag*a[i];
flag=-flag;
A2++;
}
else if(a[i]%5==2)
{
sum3++;
A3++;
}
else if(a[i]%5==3)
{
sum4+=a[i];
count++;
average=sum4*1.0/count;
A4++;
}
else if(a[i]%5==4)
{
if(a[i]>=max)
{
max=a[i];
}
A5++;
}
} //printf("%d %d %d %.1f %d",sum1,sum2,sum3,average,max);
(A1>0) ? printf("%d ",sum1):printf("N ");
(A2>0) ? printf("%d ",sum2):printf("N ");
(A3>0) ? printf("%d ",sum3):printf("N ");
(A4>0) ? printf("%.1f ",average):printf("N ");
(A5>0) ? printf("%d",max):printf("N");
return 0;
}