pat乙级测试用例常见问题集合

1012数字分类

题目:

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

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

思路:

1012数字分类思路简单,循环输入数字判断每个数字与5的余数,但是卡在最后一个测试用例没有通过,参考一下其他的文章

1012 数字分类 (20 分) | PAT 【最后一个测试点问题解决】_JoyCheung-的博客-CSDN博客

本题要注意的是A2是交错级数,会出现是0的情况,所以不能通过是0的情况就判断某一类数字不存在,这也是最后一个测试点过不了的原因。解决方法有:给A2设置一个flag,当满足两个条件时,输出N。

改进的代码:

#include<iostream>
#include<cstdio>
using namespace std;

void print(int a1, int a2, int a3, int a4, int a5, float count,int flag) {
    //输出这部分还需要参考一下别人的写法
    if (a1 == 0) {
        printf("N ");
    } else {
        printf("%d ", a1);
    }
    if (flag==0&&a2 == 0) {
        printf("N ");
    } else {
        printf("%d ", a2);
    }

    if (a3 == 0) {
        printf("N ");
    } else {
        printf("%d ", a3);
    }

    if (a4 == 0) {
        printf("N ");
    } else {
        printf("%.1f ", (float)a4 / count);
    }

    if (a5 == 0) {
        printf("N");
    } else {
        printf("%d", a5);
    }
}

int main() {
    //freopen("input.in", "r", stdin);
    int n, num;
    while (scanf("%d", &n) != EOF) {
        int c = 0;
        int m;
        int a1 = 0, a2 = 0, a3 = 0, a4 = 0, a5 = 0,flag=0;//flag为标记a2是否有数的标记
        float count = 0.0;
        for (int i = 0; i < n; i++) {
            cin >> num;
            m = num % 5;
            switch (m) {
                case 0:
                    if (num % 2 == 0) {
                        a1 += num;
                    }
                    break;
                case 1:
                    flag=1;
                    if (c == 0) {
                        c = 1;
                        a2 += num;
                    } else {
                        c = 0;
                        a2 -= num;
                    }
                    break;
                case 2:
                    a3++;
                    break;
                case 3:
                    count++;
                    a4 += num;
                    break;
                case 4:
                    if (num > a5) {
                        a5 = num;
                    }
                    break;
            }

        }
        print(a1, a2, a3, a4, a5, count,flag);

    }
    return 0;
}

1033 旧键盘打字

旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及坏掉的那些键,打出的结果文字会是怎样?

输入格式:

输入在 2 行中分别给出坏掉的那些键、以及应该输入的文字。其中对应英文字母的坏键以大写给出;每段文字是不超过 105 个字符的串。可用的字符包括字母 [a-zA-Z]、数字 0-9、以及下划线 _(代表空格)、,.-+(代表上档键)。题目保证第 2 行输入的文字串非空。

注意:如果上档键坏掉了,那么大写的英文字母无法被打出。

输出格式:

在一行中输出能够被打出的结果文字。如果没有一个字符能被打出,则输出空行。

输入样例:

7+IE.
7_This_is_a_test.

输出样例:

_hs_s_a_tst

注意事项

由于题目中出现第一个字符串可能为空的情况,就是键盘上每一个键盘都没有坏掉,所有输出的结果为空行(如果没有一个字符能被打出,则输出空行。),前几次没有考虑到这种情况,所以直接使用cin输入字符串,导致第二个字符串为空,结果错误。

改进方式:使用getline输入字符串可以避免cin输入的出现的错误。

代码

#include<iostream>
#include<cstdio>
#include<string>
#include<set>
#include<cctype>
using namespace std;

/**
输入在2行中分别给出坏掉的那些键、以及应该输入的文字。其中对应英文字母的坏键以大写给出;每段文字是不超过10^5个字符的串。可用的字符包括字母[a-z, A-Z]、数字0-9、以及下划线“_”(代表空格)、“,”、“.”、“-”、“+”(代表上档键)。题目保证第2行输入的文字串非空。
注意:如果上档键坏掉了,那么大写的英文字母无法被打出。

**/

int main(){
	// freopen("in.in","r",stdin);
	string str,source;
	// cin>>str>>source;
    getline(cin,str);//这个字符串可能为空,所以要用getline获取
    getline(cin,source);
	set<char> s;
	int tag=0;
	for(int i=0;i<str.length();i++){
		if(isalpha(str[i])){
			s.insert(str[i]);
			s.insert(tolower(str[i]));
		}else{
			if(str[i]=='+')
				tag=1;
			else s.insert(str[i]);
		}
	}
//	for(set<char>::iterator it=s.begin();it!=s.end();it++){
//		cout<<*it<<endl;
//	}
//	cout<<tag<<endl;
	
	// cout<<source<<endl;
	for(int i=0;i<source.length();i++){
		if(s.find(source[i])!=s.end()){
//			cout<<"buyao:"<<source[i]<<endl;
			continue;
		}
        if(tag&&isupper(source[i]))continue;
		cout<<source[i];
	} 
    // printf("\n");
	return 0;
}

总结

1. 使用getline(),顾名思义就是读取一行,这一行中可以包括空格。

2. cin在读取字符串时,它遇到空格或者换行符的时候就会结束此次读取,也就是说,当我们想要原封不动的输出我们输入的字符串的时候,如果直接使用cin,那么她就只会输出第一个空格前面的字符,而不会把原来的字符串都给输出出来

使用cin循环读取,但是cin以空格或者换行为结尾,并且不会输出空格

#include<iostream>
using namespace std;
int main()
{
	string str;
	while(cin >> str)
	{
		cout << str;
	}
	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值