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
-z
, A
-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;
}