问题描述:
给定一系列正整数,请按要求对数字进行分类,并输出以下 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
这道题算是很简单的,但是对输出精度的格式不熟悉的话就不能按照题目要求输出精确到小数点后一位的浮点数。
实现如下:
#include <stdio.h>
int main()
{
int count;
scanf("%d",&count);
if (count > 1000)
{
return -1;
}
int number[1000] = {0};
for (int i = 0 ; i < count ; i++)
{
scanf("%d",&number[i]);
}
double results[5] = {0.0};
int circleCount1 = 0;
int circleCount2 = 0;
for (int i = 0 ; i < count ; i++)
{
//求A1
if ((number[i] % 5) == 0 && (number[i] % 2) == 0)
{
results[0] = results[0] + number[i];
}
//求A2
if ((number[i] % 5) == 1)
{
circleCount1++;
if ((circleCount1 % 2) != 0)
{
results[1] = results[1] + number[i];
}
else
{
results[1] = results[1] - number[i];
}
}
//求A3
if ((number[i] % 5) == 2)
{
results[2]++;
}
//求A4
if ((number[i] % 5) == 3)
{
circleCount2++;
results[3] = results[3] + number[i];
}
//求A5
if ((number[i] % 5) == 4)
{
if (number[i] > results[4])
{
results[4] = number[i];
}
}
}
if (circleCount2 != 0)
{
results[3] /= circleCount2;
}
for (int i = 0 ; i < 5 ; i++)
{
if (results[i] == 0.0)
{
printf("%c",'N');
}
else
{
if (i == 3)
{
printf("%.1f",results[3]);
}
else
{
printf("%d",(int)results[i]);
}
}
if (i != 4)
{
printf("%c",' ');
}
}
return 0;
}
或者如下:
#include <iostream>
using namespace std;
int main()
{
int count;
cin >> count;
if (count > 1000)
{
return -1;
}
int number[1000] = {0};
for (int i = 0 ; i < count ; i++)
{
cin >> number[i];
}
double results[5] = {0.0};
int circleCount1 = 0;
int circleCount2 = 0;
for (int i = 0 ; i < count ; i++)
{
//求A1
if ((number[i] % 5) == 0 && (number[i] % 2) == 0)
{
results[0] = results[0] + number[i];
}
//求A2
if ((number[i] % 5) == 1)
{
circleCount1++;
if ((circleCount1 % 2) != 0)
{
results[1] = results[1] + number[i];
}
else
{
results[1] = results[1] - number[i];
}
}
//求A3
if ((number[i] % 5) == 2)
{
results[2]++;
}
//求A4
if ((number[i] % 5) == 3)
{
circleCount2++;
results[3] = results[3] + number[i];
}
//求A5
if ((number[i] % 5) == 4)
{
if (number[i] > results[4])
{
results[4] = number[i];
}
}
}
if (circleCount2 != 0)
{
results[3] /= circleCount2;
}
for (int i = 0 ; i < 5 ; i++)
{
if (results[i] == 0.0)
{
cout << "N";
}
else
{
if (i == 3)
{
cout.flags(ios::fixed);
cout.precision(1);
cout << results[3];
}
else
{
cout << (int)results[i];
}
}
if (i != 4)
{
cout << ' ';
}
}
return 0;
}
现在来复习一下C/C++中数据输出的格式控制
数据的输出格式控制:
C语言中:
1.在C语言中,头文件stdio.h中的printf函数(标准的格式输出函数)可以按照指定的格式输出数据。printf函数的声明:
int __CRTDECL printf(char const* const _Format,...);
printf函数声明在圆括号内包含格式控制和输出表列两部分。格式控制:格式控制是由双引号引起来的格式字符串,也称为“转换控制字符串”。它包括两部分:
1.格式说明符:如%d,%f等,它的作用是将要输出的数据转换成指定的格式输出。格式说明符总是由%字符开始的。
2.普通字符:即需要原样输出的字符主要是解释说明。printf("%d,%c\n",a,ch1);
这句代码中双引号内的逗号和换行符就是普通字符。
注意格式说明符中%后面的字符就是格式字符,常见的字符如下:
对于%e这个格式说明符来说,数字部分的小数位数占6位,指数占4位。小数点前必须有且仅有一位非0数字。
对于数据输出一定的长度的控制,我们来看示例:
1.整形数据的输出
#include <cstdio>
int main()
{
int a = 12;
long b = 2456988;
printf("a = %d,a = %6d,a = %-6d,a = %06d\n",a,a,a,a);
printf("%ld\n",b);
printf("%d,%o,%x",a,a,a);
printf("\n");
return 0;
}
//运行结果如下:
//a = 12, a = 12, a = 12, a = 000012
//2456988
//12, 14, c
%d:表示按照整形数据类型的整数的实际长度输出
%6d:表示该数据的输出占六位,如果不足六位左边补以空格
%-6d:表示以左对齐方式输出,如果不足六位右边补上空格
%06d:表示数据的输出占6位,如果不足六位,左边补上0
%ld:输出长整型整数
2.实型数据的输出
#include <cstdio>
int main()
{
float x = 123.456;
double y = 123.45678;
printf("%f,%f\n",x,y);
printf("%.1f,%.1f\n", x, y);
printf("%8.2f,%10.3f\n",x,y);
printf("%e\n",x);
return 0;
}
//运行结果
//123.456001, 123.456780
//123.5, 123.5
//123.46, 123.457
//1.234560e+02
%f的精度缺省值为6位
%.1f表示数据输出时精度为1
%8.2f表示数据的输出占八位,小数点后占两位(精度为2)。
%e:表示将实型数据按照指数形式输出。
3.字符型数据的输出
#include <cstdio>
int main()
{
char c = 'a';
printf("%c\n",c);
printf("%5c\n", c);
printf("%-5c\n", c);
return 0;
}
%5c:表示将数据输出,不足五位则左边补上空格
%-5c:表示将数据输出,不足五位则右边补上空格
4.字符串的输出
#include <cstdio>
int main()
{
printf("%3s\n","CHINA");
printf("%7.2s\n", "CHINA");
printf("%.4s\n", "CHINA");
printf("%-5.3s\n", "CHINA");
return 0;
}
%ms:表示输出指定宽度的字符串,若m大于字符串的实际长度,则左端补上空格,否则按照实际长度输出
%-ms:如果m大于字符串的实际长度,则输出的字符串在m列范围内左对齐,右端补上空格。
%m.ns:输出占m列,但只截取字符串的前n个字符,这n个字符输出在m列的右端,左端补上空格。
%-m.ns:mn的含义同上,只是n个字符输出在m列的左端,右端补上空格。
C++中:
#include <iostream>
#include <iomanip> //for setprecision()
using namespace std;
int main()
{
float a = 123.236554;
cout.flags(ios::fixed);
cout.precision(2); //将a这个单精度实数精确到两位输出
cout << a; //123.24
return 0;
}
网友评论