目录
1012 数字分类 (20 分)
给定一系列正整数,请按要求对数字进行分类,并输出以下 5 个数字:
- A1 = 能被 5 整除的数字中所有偶数的和;
- A2 = 将被 5 除后余 1 的数字按给出顺序进行交错求和,即计算 n1−n2+n3−n4⋯;
- A3 = 被 5 除后余 2 的数字的个数;
- A4 = 被 5 除后余 3 的数字的平均数,精确到小数点后 1 位;
- A5 = 被 5 除后余 4 的数字中最大数字。
输入格式:
每个输入包含 1 个测试用例。每个测试用例先给出一个不超过 1000 的正整数 N,随后给出 N 个不超过 1000 的待分类的正整数。数字间以空格分隔。
输出格式:
对给定的 N 个正整数,按题目要求计算 A1~A5 并在一行中顺序输出。数字间以空格分隔,但行末不得有多余空格。
若其中某一类数字不存在,则在相应位置输出 N
。
输入样例 1:
13 1 2 3 4 5 6 7 8 9 10 20 16 18
输出样例 1:
30 11 2 9.7 9
输入样例 2:
8 1 2 4 5 6 7 9 16
输出样例 2:
N 11 2 N 9
思路:
思路很朴素,if 到底
也比较麻烦,等做出来看看大家的思路
尝试AC
(一)
using namespace std;
#include<iostream>
int main() {
int a[1002];
double res[5]= {0};
int N;
int flag1(0),flag3(0);
int max(0);
cin>>N;
int i;
for(i=0; i<N; i++) {
cin>>a[i];
}
for(i=0; i<N; i++) {
// A[1]
if(a[i]>0 && a[i]%10==0) {
res[0]+=a[i];
}
// A[2]
if((a[i]-1)%5==0) {
flag1++;
if(flag1%2!=0) {
res[1]-=a[i];
} else
res[1]+=a[i];
}
//A[3]
if(a[i]/5==2) {
res[2]++;
}
//A[4]
if(a[i]/5==3){
res[3]++;
flag3++;
}res[3]=res[3]/1.0/flag3;
//A[5]
if(a[i]/5==4){
if(a[i]>res[4])
res[4]=a[i];
}
}
for(i=0; i<5; i++) {
if(i!=4) {
if(res[i]==0)
cout<<'N';
else
cout<<res[i];
cout<<' ';
}
if(i==4) {
if(res[i]==0)
cout<<'N';
else
cout<<res[i];
}
}
cout<<endl;
return 0;
}
测试用例挺多错的,解决一下
(二)
① / %的作用再一次混淆
② 输出精度错误
借鉴https://blog.csdn.net/edricbjtu/article/details/41082597
https://blog.csdn.net/qq_36667170/article/details/79265224
③ 卡在了输出平均值上,应该先把数字精度提高,再setprecious,否则出来的数字错得离谱
using namespace std;
#include<iostream>
#include<iomanip>
int main() {
int a[1002];
double res[5]= {0};
int N;
int flag1(0), flag3(0);
cin>>N;
int i;
for(i=0; i<N; i++) {
cin>>a[i];
}
for(i=0; i<N; i++) {
// A[1]
if(a[i]>0 && a[i]%10==0) {
res[0]+=a[i];
}
// A[2]
if(a[i]%5==1) {
flag1++;
if(flag1%2!=0) {
res[1]+=a[i];
} else
res[1]-=a[i];
}
//A[3]
if(a[i]%5==2) {
res[2]++;
}
//A[4]
if(a[i]%5==3) {
res[3]++;
flag3++;
}
//A[5]
if(a[i]%5==4) {
if(res[4]<a[i])
res[4]=a[i];
}
}
for(i=0; i<3; i++) {
if(res[i]==0)
cout<<'N';
else
cout<<res[i];
cout<<' ';
}
if(i==3) {
if(res[i]==0)
cout<<'N';
else{
res[3]=(double)(res[3]/flag3);
cout<<fixed<<setprecision(1)<<res[3];
}
cout<<' ';
i++;
}
if(i==4) {
if(res[i]==0)
cout<<'N';
else{
cout.unsetf(ios::fixed);
cout<<res[i];
}
}
cout<<endl;
return 0;
}
(三)
该改的都改了,测试用例也都对的
奈何只有7
using namespace std;
#include<iostream>
#include<iomanip>
int main() {
int a[1002];
double res[5]= {0};
int N;
int flag1(0), flag3(0);
cin>>N;
int i;
for(i=0; i<N; i++) {
cin>>a[i];
}
for(i=0; i<N; i++) {
// A[1]
if(a[i]%10==0) {
res[0]+=a[i];
}
// A[2]
if(a[i]%5==1) {
flag1++;
if(flag1%2!=0) {
res[1]+=a[i];
} else
res[1]-=a[i];
}
//A[3]
if(a[i]%5==2) {
res[2]++;
}
//A[4]
if(a[i]%5==3) {
res[3]+=a[i];
flag3++;
}
//A[5]
if(a[i]%5==4) {
if(res[4]<a[i])
res[4]=a[i];
}
}
for(i=0; i<3; i++) {
if(res[i]==0)
cout<<'N';
else
cout<<res[i];
cout<<' ';
}
if(i==3) {
if(res[i]==0)
cout<<'N';
else{
res[3]=(res[3]*1.0/flag3);
cout<<fixed<<setprecision(1)<<res[3];
}
cout<<' ';
i++;
}
if(i==4) {
if(res[i]==0)
cout<<'N';
else{
cout.unsetf(ios::fixed);
cout<<res[i];
}
}
cout<<endl;
return 0;
}
总结
emmm想不明白…
参考别人AC的代码之后,想明白了
https://blog.csdn.net/qq_37729102/article/details/81623622
应该是要保证交叉相减的那组分类讨论
一种是本来初始化就为0,一种是最后结果为0
奈何还是没有AC
using namespace std;
#include<iostream>
#include<iomanip>
int main() {
int a[1002];
double res[5]= {0};
int N;
int flag1(0), flag3(0);
cin>>N;
/* savior
A2可能为0,但是分为初始化为0的,以及最后结果为0的
*/
bool A2=false;
int i;
for(i=0; i<N; i++) {
cin>>a[i];
}
for(i=0; i<N; i++) {
// A[1]
if(a[i]%10==0) {
res[0]+=a[i];
}
// A[2]
if(a[i]%5==1) {
A2= true;
flag1++;
if(flag1%2!=0) {
res[1]+=a[i];
} else
res[1]-=a[i];
}
//A[3]
if(a[i]%5==2) {
res[2]++;
}
//A[4]
if(a[i]%5==3) {
res[3]+=a[i];
flag3++;
}
//A[5]
if(a[i]%5==4) {
if(res[4]<a[i])
res[4]=a[i];
}
}
if(res[0])
cout<<res[0]<<' ';
else
cout<<'N'<<' ';
if(res[1])
cout<<res[1]<<' ';
else
cout<<'N'<<' ';
if(A2)
cout<<res[2]<<' ';
else
cout<<'N'<<' ';
if(res[3])
cout<<' '<<setiosflags(ios::fixed)<<setprecision(1)<<res[3]*1.0/flag3<<' ';
else
cout<<'N'<<' ';
if(res[4]){
cout.unsetf(ios::fixed);
cout<<res[4]<<endl;
}
else
cout<<'N'<<endl;
// for(i=0; i<3; i++) {
// if(res[i]==0)
// cout<<'N';
// else
// cout<<res[i];
// cout<<' ';
// }
//
// if(i==3) {
// if(res[i]==0)
// cout<<'N';
// else{
// res[3]=(res[3]*1.0/flag3);
// cout<<fixed<<setprecision(1)<<res[3];
// }
// cout<<' ';
// i++;
// }
//
// if(i==4) {
// if(res[i]==0)
// cout<<'N';
// else{
// cout.unsetf(ios::fixed);
// cout<<res[i];
// }
// }
return 0;
}