蓝桥杯05

特别数的和

简单模拟, 今日打卡第一题

题目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<iostream>
using namespace std;
int main(){
int n, ans = 0;
cin >> n;
for(int i = 1; i <= n; i++){
int num = i;
while(num != 0){
int temp = num % 10;
if(temp == 2 || temp == 1 || temp == 0 || temp == 9) {
ans += i;
break;
}
num /= 10;
}
}
cout << ans << endl;
return 0;
}

错误票据

题目

题目

题目本身没有难度,就是考的输入

借这里强调一下scanf吧,scanf会留下回车,scanf的结束符在键盘上是【ctrl+z】,在文本中是EOF【END OF FILE】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<iostream>
#include<algorithm>
using namespace std;
int a[100010];

int main(){
int n;
scanf("%d", &n);
int mi = 110, ma = -1;
while(scanf("%d", &n) != EOF){
a[n]++;
mi = min(mi, n);
ma = max(ma, n);
}
int cut, wro;
for(int i = mi; i <= ma; i++){
if(a[i] == 2) wro = i;
if(a[i] == 0) cut = i;
}
cout << cut << ' ' << wro << endl;
return 0;
}

yxc的代码用的sstream流,太神奇了

要强调几点

cin的结束符是回车,读取结束后回车仍然会保留在缓冲区中,会让下次的输入继续读取,如果还是cin,那就再留到下一次,空格是不会处理的,scanf同理

getline则是先读取一行,如果碰到回车就会结束,但不会进入缓冲区。所以就可以用getline单独处理cin留下的空格

1
2
cin >> x;			//用x保存输入内容,并留下回车
getline(cin, s); //用s吸收掉回车

stringstream用于分割被空格,制表符号分割的字符串

1
2
3
4
5
6
7
8
9
10
11
12
#include<iostream>  
#include<sstream> //istringstream 必须包含这个头文件
#include<string>
using namespace std;
int main(){
string str="i am a boy";
istringstream is(str);
string s;
while(is>>s) {
cout<<s<<endl;
}
}
1
2
3
4
i
am
a
boy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <cstring>
#include <sstream>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 10010;
int n;
int a[N];
int main()
{
int cnt;
cin >> cnt;
string line;

getline(cin, line); // 忽略掉第一行的回车(getline能吸收回车并删除di)
while (cnt -- )
{
getline(cin, line);
stringstream ssin(line);
while (ssin >> a[n]) n ++ ; //从0开始分割字符串并赋值
}
sort(a, a + n);
int res1, res2;
for (int i = 1; i < n; i ++ )
if (a[i] == a[i - 1]) res2 = a[i]; // 重号
else if (a[i] >= a[i - 1] + 2) res1 = a[i] - 1; // 断号

cout << res1 << ' ' << res2 << endl;
return 0;
}