洛谷刷题五

【深基6.例1】自动修正

题目描述

大家都知道一些办公软件有自动将字母转换为大写的功能。输入一个长度不超过 \(100\) 且不包括空格的字符串。要求将该字符串中的所有小写字母变成大写字母并输出。

输入格式

输入一行,一个字符串。

输出格式

输出一个字符串,即将原字符串中的所有小写字母转化为大写字母。

样例 #1

样例输入 #1

1
Luogu4!

样例输出 #1

1
LUOGU4!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<iostream>
using namespace std;
#define N 100
long long a[N];
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
string a;
cin >> a;
for (int i = 0; i < a.size(); i++)
{
if (a[i]>='a'&&a[i]<='z')
{
a[i] -= 32;
}


}

cout << a;

}

小书童——凯撒密码

题目背景

某蒟蒻迷上了 “小书童”,有一天登陆时忘记密码了(他没绑定邮箱 or 手机),于是便把问题抛给了神犇你。

题目描述

蒟蒻虽然忘记密码,但他还记得密码是由一个字符串组成。密码是由原文字符串(由不超过 50 个小写字母组成)中每个字母向后移动 \(n\) 位形成的。z 的下一个字母是 a,如此循环。他现在找到了移动前的原文字符串及 \(n\),请你求出密码。

输入格式

第一行:\(n\)。第二行:未移动前的一串字母。

输出格式

一行,是此蒟蒻的密码。

样例 #1

样例输入 #1

1
2
1
qwe

样例输出 #1

1
rxf

提示

字符串长度 \(\le 50\)\(1 \leq n \leq 26\)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
int n;

cin >> n;
string a;
cin >> a;
for (int i = 0; i < a.size(); i++)
{
cout << char((a[i] - 'a' + n) % 26 + 'a');

}
}

[NOIP2008 提高组] 笨小猴

题目描述

笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!

这种方法的具体描述如下:假设 \(\text{maxn}\) 是单词中出现次数最多的字母的出现次数,\(\text{minn}\) 是单词中出现次数最少的字母的出现次数,如果 \(\text{maxn}-\text{minn}\) 是一个质数,那么笨小猴就认为这是个 Lucky Word,这样的单词很可能就是正确的答案。

输入格式

一个单词,其中只可能出现小写字母,并且长度小于 \(100\)

输出格式

共两行,第一行是一个字符串,假设输入的的单词是 Lucky Word,那么输出 Lucky Word,否则输出 No Answer

第二行是一个整数,如果输入单词是 Lucky Word,输出 \(\text{maxn}-\text{minn}\) 的值,否则输出 \(0\)

样例 #1

样例输入 #1

1
error

样例输出 #1

1
2
Lucky Word
2

样例 #2

样例输入 #2

1
olympic

样例输出 #2

1
2
No Answer
0

提示

【输入输出样例 1 解释】

单词 error 中出现最多的字母 \(\texttt r\) 出现了 \(3\) 次,出现次数最少的字母出现了 \(1\) 次,\(3-1=2\)\(2\) 是质数。

【输入输出样例 2 解释】

单词 olympic 中出现最多的字母 \(\texttt i\) 出现了 \(1\) 次,出现次数最少的字母出现了 \(1\) 次,\(1-1=0\)\(0\) 不是质数。

(本处原题面错误已经修正)

noip2008 提高第一题

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include<iostream>
#include<string>
using namespace std;
string arr;
int b[150];
int word[26];
bool isprime(int x) {
if (x <= 1)return 0;
if (x == 2)return 1;
for (int i = 2; i * i <= x; i++) {
if (x % i == 0)return 0;
}
return 1;
}
int main() {
int max = 0;
int min = 110;
int n ;
cin >> arr;
n = arr.length();

for (int i = 0; i < n; i++)
{
b[arr[i] - 'a']++;
}
for (int j = 0; j < 26; j++)
{
if (max < b[j])
{
max = b[j];
}
if (min > b[j]&&b[j]!=0) {
min = b[j];
}
}
int delta = max - min;
if (isprime(delta)) {
cout << "Lucky Word"<<"\n";
cout << delta;
}
else {
cout << "No Answer"<<'\n';
cout << 0;
}
return 0;
}

口算练习题

题目描述

王老师正在教简单算术运算。细心的王老师收集了 \(i\) 道学生经常做错的口算题,并且想整理编写成一份练习。 编排这些题目是一件繁琐的事情,为此他想用计算机程序来提高工作效率。王老师希望尽量减少输入的工作量,比如 \(\texttt{5+8}\) 的算式最好只要输入 \(\texttt 5\)\(\texttt 8\),输出的结果要尽量详细以方便后期排版的使用,比如对于上述输入进行处理后输出 \(\texttt{5+8=13}\) 以及该算式的总长度 \(6\)。王老师把这个光荣的任务交给你,请你帮他编程实现以上功能。

输入格式

第一行一个整数 \(i\)

接着的 \(i\) 行为需要输入的算式,每行可能有三个数据或两个数据。

若该行为三个数据则第一个数据表示运算类型,\(\texttt a\) 表示加法运算,\(\texttt b\) 表示减法运算,\(\texttt c\) 表示乘法运算,接着的两个数据表示参加运算的运算数。

若该行为两个数据,则表示本题的运算类型与上一题的运算类型相同,而这两个数据为运算数。

输出格式

输出 \(2\times i\) 行。对于每个输入的算式,输出完整的运算式及结果,第二行输出该运算式的总长度。

样例 #1

样例输入 #1

1
2
3
4
5
4
a 64 46
275 125
c 11 99
b 46 64

样例输出 #1

1
2
3
4
5
6
7
8
64+46=110
9
275+125=400
11
11*99=1089
10
46-64=-18
9

提示

【数据规模与约定】

对于 \(50\%\) 的数据,输入的算式都有三个数据,第一个算式一定有三个数据。

对于所有数据,\(0<i\leq 50\),运算数为非负整数且小于 \(10000\)

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
#include <iostream> 
#include <cstring>
#include <cstdio>
using namespace std;
char s[1000], b[10];
char a;
int n, c, d;
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
cin >> b;
if (b[0] >= 'a' && b[0] <= 'z')
{
a = b[0];
cin >> c >> d;
}
else {
sscanf(b, "%d", &c);
cin >> d;
}
if (a == 'a')
sprintf(s, "%d+%d=%d", c, d, c + d);
else if (a == 'b')
sprintf(s, "%d-%d=%d", c, d, c - d);
else if (a == 'c')
sprintf(s, "%d*%d=%d", c, d, c * d);
cout << s << '\n' <<strlen(s) << '\n';
}
}

[NOIP2018 普及组] 标题统计

题目背景

NOIP2018 普及组 T1

题目描述

凯凯刚写了一篇美妙的作文,请问这篇作文的标题中有多少个字符? 注意:标题中可能包含大、小写英文字母、数字字符、空格和换行符。统计标题字符数时,空格和换行符不计算在内。

输入格式

输入文件只有一行,一个字符串 \(s\)

输出格式

输出文件只有一行,包含一个整数,即作文标题的字符数(不含空格和换行符)。

样例 #1

样例输入 #1

1
234

样例输出 #1

1
3

样例 #2

样例输入 #2

1
Ca 45

样例输出 #2

1
4

提示

样例 1 说明

标题中共有 3 个字符,这 3 个字符都是数字字符。

样例 2 说明

标题中共有 $ 5$ 个字符,包括 \(1\) 个大写英文字母, \(1\) 个小写英文字母和 \(2\) 个数字字符, 还有 \(1\) 个空格。由于空格不计入结果中,故标题的有效字符数为 \(4\) 个。

数据规模与约定

规定 \(|s|\) 表示字符串 \(s\) 的长度(即字符串中的字符和空格数)。
对于 \(40\%\) 的数据,\(1 ≤ |s| ≤ 5\),保证输入为数字字符及行末换行符。
对于 \(80\%\) 的数据,\(1 ≤ |s| ≤ 5\),输入只可能包含大、小写英文字母、数字字符及行末换行符。
对于 \(100\%\) 的数据,\(1 ≤ |s| ≤ 5\),输入可能包含大、小写英文字母、数字字符、空格和行末换行符。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
string s;
int sum = 0;
while (cin>>s)
{
sum += s.length();

}
cout << sum;




return 0;

}

手机

题目描述

一般的手机的键盘是这样的:

要按出英文字母就必须要按数字键多下。例如要按出 \(\tt x\) 就得按 \(9\) 两下,第一下会出 \(\tt w\),而第二下会把 \(\tt w\) 变成 \(\tt x\)\(0\) 键按一下会出一个空格。

你的任务是读取若干句只包含英文小写字母和空格的句子,求出要在手机上打出这个句子至少需要按多少下键盘。

输入格式

一行句子,只包含英文小写字母和空格,且不超过 200 个字符。

输出格式

一行一个整数,表示按键盘的总次数。

样例 #1

样例输入 #1

1
i have a dream

样例输出 #1

1
23

提示

NOI 导刊 2010 普及(10)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 #include<bits/stdc++.h>
using namespace std;
int ans;
string a;
int num[26]={1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,4,1,2,3,1,2,3,4};
int main()
{
getline(cin,a);
for(int i=0;i<a.length();i++)
{
if(a[i]>='a'&&a[i]<='z') ans+=num[a[i]-'a'];
if(a[i]==' ') ans++;
}
printf("%d",ans);

}

honoka的键盘

题目背景

honoka 有一个只有两个键的键盘。

题目描述

一天,她打出了一个只有这两个字符的字符串。当这个字符串里含有 VK 这个字符串的时候,honoka 就特别喜欢这个字符串。所以,她想改变至多一个字符(或者不做任何改变)来最大化这个字符串内 VK 出现的次数。给出原来的字符串,请计算她最多能使这个字符串内出现多少次 VK(只有当 VK 正好相邻时,我们认为出现了 VK。)

输入格式

第一行给出一个数字 \(n\),代表字符串的长度。

第二行给出一个字符串 \(s\)

输出格式

第一行输出一个整数代表所求答案。

样例 #1

样例输入 #1

1
2
2
VK

样例输出 #1

1
1

样例 #2

样例输入 #2

1
2
2
VV

样例输出 #2

1
1

样例 #3

样例输入 #3

1
2
1
V

样例输出 #3

1
0

样例 #4

样例输入 #4

1
2
20
VKKKKKKKKKVVVVVVVVVK

样例输出 #4

1
3

样例 #5

样例输入 #5

1
2
4
KVKV

样例输出 #5

1
1

提示

对于 \(100\%\) 的数据,\(1\le n\le 100\)

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
31
32
33
34
35
36

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
using namespace std;
string a;
int main()
{
int n;
cin >> n;
cin >> a;
int ans = 0;
for (int i = 0; i < a.length() - 1; i++)
{
if (a[i] == 'V' && a[i + 1] == 'K')
{
ans++;
a[i] = 'X';
a[i + 1] = 'X';
}
}
for (int i = 0; i < a.length()-1; i++)
{
if (a[i] != 'X' && a[i] == a[i + 1])
{
ans += 1;
break;
}
}
cout << ans;

}


单词覆盖还原

题目描述

一个长度为 \(l\) 的字符串中被反复贴有 boygirl 两单词,后贴上的可能覆盖已贴上的单词(没有被覆盖的用句点表示),最终每个单词至少有一个字符没有被覆盖。问贴有几个 boy 几个 girl

输入格式

一行被反复贴有 boygirl 两单词的字符串。

输出格式

两行,两个整数。第一行为 boy 的个数,第二行为 girl 的个数。

样例 #1

样例输入 #1

1
......boyogirlyy......girl.......

样例输出 #1

1
2
4
2

提示

数据保证,\(3\le l\le255\),字符串仅仅包含如下字符:\(\texttt{.bgilory}\)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<iostream>
#include<string>
using namespace std;
int boy, girl, len;
string st;
int main()
{
cin >> st;
len = st.size();

for (int i = 0; i < len - 2; i++) //
if (st[i] == 'b' || st[i + 1] == 'o' || st[i + 2] == 'y')boy++;


for (int i = 0; i < len - 3; i++) //枚举开始点,注意len-3,不然会越界,因为下面要i+3
if (st[i] == 'g' || st[i + 1] == 'i' || st[i + 2] == 'r' || st[i + 3] == 'l')girl++;


cout << boy << "\n" << girl;
}

数字反转(升级版)

题目背景

以下为原题面,仅供参考:

给定一个数,请将该数各个位上数字反转得到一个新数。

这次与 NOIp2011 普及组第一题不同的是:这个数可以是小数,分数,百分数,整数。整数反转是将所有数位对调;小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分;分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母;百分数的分子一定是整数,百分数只改变数字部分。整数新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零;小数新数的末尾不为 \(0\)(除非小数部分除了 \(0\) 没有别的数,那么只保留1个 \(0\));分数不约分,分子和分母都不是小数(约分滴童鞋抱歉了,不能过哦。输入数据保证分母不为 \(0\)),本次没有负数。

题目描述

给定一个数,请将该数各个位上数字反转得到一个新数。

这次与 NOIp2011 普及组第一题不同的是:这个数可以是小数,分数,百分数,整数。

  • 整数反转是将所有数位对调。

  • 小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分。

  • 分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母。

  • 百分数的分子一定是整数,百分数只改变数字部分。

输入格式

一个实数 \(s\)

输出格式

一个实数,即 \(s\) 的反转数

样例 #1

样例输入 #1

1
5087462

样例输出 #1

1
2647805

样例 #2

样例输入 #2

1
600.084

样例输出 #2

1
6.48

样例 #3

样例输入 #3

1
700/27

样例输出 #3

1
7/72

样例 #4

样例输入 #4

1
8670%

样例输出 #4

1
768%

提示

【数据范围】

  • 对于 \(25\%\) 的数据,\(s\) 是整数,不大于 \(20\) 位;
  • 对于 \(25\%\) 的数据,\(s\) 是小数,整数部分和小数部分均不大于 \(10\) 位;
  • 对于 \(25\%\) 的数据,\(s\) 是分数,分子和分母均不大于 \(10\) 位;
  • 对于 \(25\%\) 的数据,\(s\) 是百分数,分子不大于 \(19\) 位。

【数据保证】

  • 对于整数翻转而言,整数原数和整数新数满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数和原来的数字的最高位数字不应为零。

  • 对于小数翻转而言,其小数点前面部分同上,小数点后面部分的形式,保证满足小数的常见形式,也就是末尾没有多余的 \(0\)(小数部分除了 \(0\) 没有别的数,那么只保留 \(1\)\(0\)。若反转之后末尾数字出现 \(0\),请省略多余的 \(0\)

  • 对于分数翻转而言,分数不约分,分子和分母都不是小数。输入的分母不为 \(0\)。与整数翻转相关规定见上。

  • 对于百分数翻转而言,见与整数翻转相关内容。

数据不存在负数。

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
31
32
33
34
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s;
char p = 0;
int cnt = 0;
cin >> s;
for (int i = 0; i < s.size(); i++)
{
if (s[i] >= '0' && s[i] <= '9') cnt++;
else
{
p = s[i];
break;
}
}
int x = cnt;
cnt -= 1;
while (s[cnt] == '0' && cnt > 0) cnt--;
for (int i = cnt; i >= 0; i--)
cout << s[i];
if (p == 0) return 0;
else
if (p == '%') { cout << p; return 0; }
else cout << p;
int m = s.size() - 1;
while (s[x + 1] == '0' && x < m - 1) x++;
while (s[m] == '0' && m > x + 1) m--;
for (int i = m; i > x; i--)
cout << s[i];

}

斯诺登的密码

题目背景

根据斯诺登事件出的一道水题

题目描述

2013 年 X 月 X 日,俄罗斯办理了斯诺登的护照,于是他混迹于一架开往委内瑞拉的飞机。但是,这件事情太不周密了,因为 FBI 的间谍早已获悉他的具体位置——但这不是最重要的——最重要的是如果要去委内瑞拉,那么就要经过古巴,而经过古巴的路在美国的掌控之中。

丧心病狂的奥巴马迫降斯诺登的飞机,搜查时却发现,斯诺登杳无踪迹。但是,在据说是斯诺登的座位上,发现了一张纸条。纸条由纯英文构成:Obama is a two five zero.(以 . 结束输出,只有 \(6\) 个单词+一个句号,句子开头如没有大写亦为合法)这句话虽然有点无厘头,但是警官陈珺骛发现这是一条极其重要的线索。他在斯诺登截获的一台笔记本中找到了一个 C++ 程序,输入这条句子后立马给出了相对应的密码。陈珺鹜高兴得晕了过去,身为警官的你把字条和程序带上了飞机,准备飞往曼哈顿国际机场,但是在飞机上检查的时候发现——程序被粉碎了!飞机抵达华盛顿只剩 \(5\) 分钟,你必须在这 \(5\) 分钟内编写(杜撰)一个程序,免受上司的 \(10000000000 \bmod 10\) 大板。破译密码的步骤如下:

(1)找出句子中所有用英文表示的数字 \((\leq 20)\),列举在下:

正规:one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty

非正规:a both another first second third。为避免造成歧义,another 算作 \(1\) 处理。

(2)将这些数字平方后对 \(100\) 取模,如 \(00,05,11,19,86,99\)

(3)把这些两位数按数位排成一行,组成一个新数,如果开头为 \(0\),就去 \(0\)

(4)找出所有排列方法中最小的一个数,即为密码。

// 数据已经修正 By absi2011 如果还有问题请联系我

输入格式

一个含有 \(6\) 个单词的句子。

输出格式

一个整型变量(密码)。如果没有符合要求的数字出现,则输出 \(0\)

样例 #1

样例输入 #1

1
Black Obama is two five zero .

样例输出 #1

1
425
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
31
32
33
34
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
map<string, int>q;
const int mx = 66;
int top;
int st[mx];
string s;
int main() {

q["one"] = 1; q["two"] = 2; q["three"] = 3; q["four"] = 4; q["five"] = 5; q["six"] = 6; q["seven"] = 7; q["eight"] = 8; q["nine"] = 9; q["ten"] = 10;
q["eleven"] = 11; q["twelve"] = 12; q["thirteen"] = 13; q["fourteen"] = 14; q["fifteen"] = 15; q["sixteen"] = 16; q["seventeen"] = 17; q["eighteen"] = 18; q["nineteen"] = 19; q["twenty"] = 20;
q["a"] = 1; q["both"] = 2; q["another"] = 1; q["first"] = 1; q["second"] = 2; q["third"] = 3;

for (int i = 1; i <= 6; i++) {
cin >> s;
if (q[s]) {
int k = q[s] * q[s] % 100;
if (k == 0)continue;
st[++top] = k;
}
}
sort(st + 1, st + top + 1);
cout << st[1];
for (int i = 2; i <= top; i++) {
if (st[i] < 10)cout << 0;
cout << st[i];
}
return 0;

}

[USACO1.1] 你的飞碟在这儿 Your Ride Is Here

题目描述

众所周知,在每一个彗星后都有一只 UFO。这些 UFO 时常来收集地球上的忠诚支持者。不幸的是,他们的飞碟每次出行都只能带上一组支持者。因此,他们要用一种聪明的方案让这些小组提前知道谁会被彗星带走。他们为每个彗星起了一个名字,通过这些名字来决定这个小组是不是被带走的那个特定的小组(你认为是谁给这些彗星取的名字呢?)。关于如何搭配的细节会在下面告诉你;你的任务是写一个程序,通过小组名和彗星名来决定这个小组是否能被那颗彗星后面的 UFO 带走。

小组名和彗星名都以下列方式转换成一个数字:最终的数字就是名字中所有字母的积,其中 \(\texttt A\)\(1\)\(\texttt Z\)\(26\)。例如,\(\texttt{USACO}\) 小组就是 \(21 \times 19 \times 1 \times 3 \times 15=17955\)。如果小组的数字 \(\bmod 47\) 等于彗星的数字 \(\bmod 47\),你就得告诉这个小组需要准备好被带走!(记住“\(a \bmod b\)”是 \(a\) 除以 \(b\) 的余数,例如 \(34 \bmod 10\) 等于 \(4\)

写出一个程序,读入彗星名和小组名并算出用上面的方案能否将两个名字搭配起来,如果能搭配,就输出 GO,否则输出 STAY。小组名和彗星名均是没有空格或标点的一串大写字母(不超过 \(6\) 个字母)。

输入格式

第1行:一个长度为 \(1\)\(6\) 的大写字母串,表示彗星的名字。

第2行:一个长度为 \(1\)\(6\) 的大写字母串,表示队伍的名字。

输出格式

样例 #1

样例输入 #1

1
2
COMETQ
HVNGAT

样例输出 #1

1
GO

样例 #2

样例输入 #2

1
2
ABSTAR
USACO

样例输出 #2

1
STAY

提示

题目翻译来自 NOCOW。

USACO Training Section 1.1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <cstring>
using namespace std ;

string a , b ;
int ans = 1 , num = 1 ;
main(){
cin >> a >> b ;
for( int i = 0 ; i < a.length() ; i ++ ) ans *= a[i] - 64;

for( int i = 0 ; i < b.length() ; i ++ ) num *= b[i] - 64 ;

ans %= 47 , num %= 47 ;
if( ans == num ) cout << "GO" ;
else cout << "STAY" ;
}

语句解析

题目背景

木有背景……

题目描述

一串长度不超过 \(255\) 的 PASCAL 语言代码,只有 \(a,b,c\) 三个变量,而且只有赋值语句,赋值只能是一个一位的数字或一个变量,每条赋值语句的格式是 [变量]:=[变量或一位整数];。未赋值的变量值为 \(0\) 输出 \(a,b,c\) 的值。

输入格式

一串符合语法的 PASCAL 语言,只有 \(a,b,c\) 三个变量,而且只有赋值语句,赋值只能是一个一位的数字或一个变量,未赋值的变量值为 \(0\)

输出格式

输出 \(a,b,c\) 最终的值。

样例 #1

样例输入 #1

1
a:=3;b:=4;c:=5;

样例输出 #1

1
3 4 5

提示

输入的 PASCAL 语言长度不超过 \(255\)

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
31
32
33
34
35
36
37
38
39
40
41
42
#include<cstdio>
#include<cstring>
using namespace std;
int main(){
char s[256];
int a=0,b=0,c=0;
scanf("%s",s);
int n=strlen(s);
for(int i=0;i<n;i+=5){
switch(s[i]){
case 'a': {
switch(s[i+3]){
case 'a': a=a;break;
case 'b': a=b;break;
case 'c': a=c;break;
default: a=s[i+3]-'0';
}
break;
}
case 'b': {
switch(s[i+3]){
case 'a': b=a;break;
case 'b': b=b;break;
case 'c': b=c;break;
default: b=s[i+3]-'0';
}
break;
}
case 'c': {
switch(s[i+3]){
case 'a': c=a;break;
case 'b': c=b;break;
case 'c': c=c;break;
default: c=s[i+3]-'0';
}
break;
}
}
}
printf("%d %d %d",a,b,c);
return 0;
}

垂直柱状图

题目描述

写一个程序从输入文件中去读取四行大写字母(全都是大写的,每行不超过 \(100\) 个字符),然后用柱状图输出每个字符在输入文件中出现的次数。严格地按照输出样例来安排你的输出格式。

输入格式

四行字符,由大写字母组成,每行不超过 \(100\) 个字符

输出格式

由若干行组成,前几行由空格和星号组成,最后一行则是由空格和字母组成的。在任何一行末尾不要打印不需要的多余空格。不要打印任何空行。

样例 #1

样例输入 #1

1
2
3
4
THE QUICK BROWN FOX JUMPED OVER THE LAZY DOG.
THIS IS AN EXAMPLE TO TEST FOR YOUR
HISTOGRAM PROGRAM.
HELLO!

样例输出 #1

1
2
3
4
5
6
7
8
9
10
11
*
*
* *
* * * *
* * * *
* * * * * *
* * * * * * * * * *
* * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * *
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

提示

每行输出后面不允许出现多余的空格。

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
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
using namespace std;
int ff[26];//定义计数数组
int main()
{
int i, j, n, maxn = 0; string a;
for (i = 0; i < 4; i++)
{
getline(cin, a);
n = a.length();
for (j = 0; j < n; j++)if (a[j] >= 'A' && a[j] <= 'Z')ff[a[j] - 'A']++;
}
for (i = 0; i < 26; i++)maxn = max(maxn, ff[i]);
for (i = maxn; i > 0; i--) {
for (j = 0; j < 26; j++)
if (ff[j] >= i)printf("* "); else printf(" ");
printf("\n");
}
for (i = 0; i < 26; i++)printf("%c ", i + 'A');
}