PTA1012 数字分类

题目:

给定一系列正整数,请按要求对数字进行分类,并输出以下 5 个数字:

  • A​1​​ = 能被 5 整除的数字中所有偶数的和;
  • A​2​​ = 将被 5 除后余 1 的数字按给出顺序进行交错求和,即计算 n​1​​−n​2​​+n​3​​−n​4​​⋯;
  • A​3​​ = 被 5 除后余 2 的数字的个数;
  • A​4​​ = 被 5 除后余 3 的数字的平均数,精确到小数点后 1 位;
  • A​5​​ = 被 5 除后余 4 的数字中最大数字。

输入格式:

每个输入包含 1 个测试用例。每个测试用例先给出一个不超过 1000 的正整数 N,随后给出 N 个不超过 1000 的待分类的正整数。数字间以空格分隔。

输出格式:

对给定的 N 个正整数,按题目要求计算 A​1​​~A​5​​ 并在一行中顺序输出。数字间以空格分隔,但行末不得有多余空格。

若其中某一类数字不存在,则在相应位置输出 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>

#include<algorithm>

using namespace std;

int n;

int num[1005];

int main()

{

scanf("%d",&n);

int a1,a2,b2,b3,a4,maxx,b4;

a1=0;

a2=0;

b2=1;

b3=0;

a4=0;

b4=0;

maxx=-1;

for(int i=0;i<n;i++)

{

scanf("%d",&num[i]);

int k=num[i]%5;

if(k==0)

{

if(num[i]%2==0)

a1+=num[i];

}

if(k==1)

{

if(b2%2==1)

{

a2+=num[i];

}

else

a2-=num[i];

b2++;

}

if(k==2)

{

b3++;

}

if(k==3)

{

a4+=num[i];

b4++;

}

if(k==4)

{

maxx=max(maxx,num[i]);

}

}

if(a1==0)

{

printf("N");

}

else

printf("%d",a1);

if(b2==1)

printf(" N");

else

printf(" %d",a2);

if(b3==0)

printf(" N");

else

printf(" %d",b3);

if(a4==0)

printf(" N");

else

printf(" %.1lf", (double)a4*1.0/b4);

if(maxx==-1)

printf(" N");

else

printf(" %d\n",maxx);

return 0;

}

 

### PTA 中判断字符是否为数字的方法 在 PTA 的题目中,可以通过多种方式来判断一个字符是否为数字。以下是几种常见的方法及其代码示例: #### 方法一:使用条件语句直接比较 ASCII 值 这种方法是最基础的方式之一,通过判断字符的 ASCII 值范围来确认其是否属于 `'0'` 至 `'9'`。 ```c #include <stdio.h> int main() { char c; scanf("%c", &c); if (c >= '0' && c <= '9') { // 判断字符是否位于 '0' 和 '9' 之间 printf("digit"); } else if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) { // 判断字母范围 printf("character"); } else { printf("ERROR"); } return 0; } ``` 上述代码实现了基本的功能需求[^1]。 --- #### 方法二:利用 `<ctype.h>` 库中的 `isdigit()` 函数 C 标准库提供了专门用于字符分类的头文件 `<ctype.h>`,其中的 `isdigit()` 函数可以直接用来检测某个字符是否为数字。 ```c #include <stdio.h> #include <ctype.h> // 引入 ctype.h 头文件 int main() { char c; scanf("%c", &c); if (isdigit(c)) { // 使用 isdigit() 判断字符是否为数字 printf("digit"); } else if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) { printf("character"); } else { printf("ERROR"); } return 0; } ``` 此方法更加简洁明了,并且减少了手动处理 ASCII 范围的需求[^3]。 --- #### 方法三:结合字符串操作提取数字子串 当需要从较长的字符串中筛选出所有的数字字符时,可以采用循环遍历配合条件判断的方式来完成任务。 ```c #include <stdio.h> #include <stdlib.h> #define MAXN 81 void extract_digits(char input[], int length) { char digits[length]; int count = 0; for (int i = 0; i < length; i++) { if (input[i] >= '0' && input[i] <= '9') { // 提取数字字符 digits[count++] = input[i]; } } digits[count] = '\0'; // 添加字符串结束标志 int number = atoi(digits); // 将数字字符串转换为整数 printf("%d\n", number); } int main() { char input_string[MAXN]; fgets(input_string, sizeof(input_string), stdin); // 获取一行输入 int len = 0; while (input_string[len] != '\n' && input_string[len] != '\0') { len++; } extract_digits(input_string, len); return 0; } ``` 这段代码展示了如何从用户输入的一行数据中提取所有连续的数字并将其转化为整数值[^3]。 --- ### 总结 以上三种方法分别适用于不同的场景: - **方法一**适合简单的单字符判断; - **方法二**借助标准库函数提高可读性和效率; - **方法三**针对复杂情况下的批量处理提供了解决方案。 每种方法都有自己的适用场合,在实际编程过程中可以根据具体需求灵活选用。 问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值