P5733 [深基6.例1] 自动修正
#include <cstdio>
#include <cstring>
char s[105];
int main()
{
scanf("%s", s);
int len = strlen(s);
for (int i = 0; i < len; ++i) {
if (s[i] >= 'a' && s[i] <= 'z') {
s[i] -= 32;
}
}
printf("%s\n", s);
return 0;
}
P1914 小书童——凯撒密码
#include <cstdio>
#include <cstring>
char psw[55];
int main()
{
int n;
scanf("%d%s", &n, psw);
n %= 26;
for (int i = 0; psw[i] != '\0'; i++) {
psw[i] = (psw[i] - 'a' + n) % 26 + 'a';
}
printf("%s\n", psw);
return 0;
}
P5015 [NOIP2018 普及组] 标题统计
#include <iostream>
#include <string>
using namespace std;
string s;
int main()
{
getline(cin, s);
int ans = 0;
for (int i = 0; i < s.length(); i++)
if (s[i] != ' ') ans++;
printf("%d\n", ans);
return 0;
}
P5734 [深基6.例6] 文字处理软件
#include <cstdio>
#include <iostream>
#include <string>
using namespace std;
int main()
{
int q;
string s;
cin >> q >> s;
for (int i = 0; i < q; i++) {
int op;
scanf("%d", &op);
if (op == 1) {
string t;
cin >> t;
s += t;
cout << s << endl;
} else if (op == 2) {
int a, b;
scanf("%d%d", &a, &b);
s = s.substr(a, b);
cout << s << endl;
} else if (op == 3) {
int a;
scanf("%d", &a);
string t;
cin >> t;
s.insert(a, t);
cout << s << endl;
} else {
string t;
cin >> t;
printf("%d\n", int(s.find(t)));
}
}
return 0;
}
P3741 honoka的键盘
#include <iostream>
#include <string>
using namespace std;
int main() {
int n;
string s;
cin >> n >> s;
// 1. 统计原有的VK数量
int vk = 0;
for (int i = 0; i <= n - 2; i++) {
if (s[i] == 'V' && s[i+1] == 'K') vk++;
}
// 2.找VVV KKK 开头的KK 结尾的VV
// 0~n-1
// VVV KKK i:1~n-2 s[i-1]==s[i] && s[i]==s[i+1]
// KK i==0 s[i] s[i+1]
// VV i==n-1 s[i] s[i-1]
if (n > 1) {
for (int i = 0; i < n; i++) {
if (i==0 && s[i]=='K' && s[i+1]=='K') {
vk++; break;
}
if (i==n-1 && s[i]=='V' && s[i-1]=='V') {
vk++; break;
}
if (i>=1 && i<=n-2 && s[i-1]==s[i] && s[i]==s[i+1]) {
vk++; break;
}
}
}
cout<<vk<<endl;
return 0;
}
P1200 [USACO1.1] 你的飞碟在这儿 Your Ride Is Here
#include <cstdio>
char c[10], t[10];
int main()
{
scanf("%s%s", c, t);
int x = 1, y = 1;
for (int i = 0; c[i] != 0; ++i)
x = x * (c[i] - 'A' + 1) % 47;
for (int i = 0; t[i] != 0; ++i)
y = y * (t[i] - 'A' + 1) % 47;
printf("%s\n", x == y ? "GO" : "STAY");
return 0;
}
P1597 语句解析
#include <cstdio>
using namespace std;
char code[300];
int a[3];
int main()
{
scanf("%s", code);
int i = 0;
while (code[i] != '\0') {
if (code[i] >= 'a' && code[i] <= 'c') {
int cur = code[i] - 'a';
char r = code[i + 3];
if (r >= '0' && r <= '9') a[cur] = r - '0';
else a[cur] = a[r - 'a'];
i += 5;
} else ++i;
}
printf("%d %d %d\n", a[0], a[1], a[2]);
return 0;
}
P1055 [NOIP2008 普及组] ISBN 号码
#include <cstdio>
char s[20];
int main()
{
scanf("%s", s);
int sum = 0, num = 0;
for (int i=0; i<=10; i++) {
if (s[i]>='0' && s[i]<='9') {
num++;
sum += num * (s[i]-'0');
}
}
sum%=11;
// s[12](char) sum(int)
// 'X' 10
// '0'~'9' 0~9
if (s[12]=='X' && sum==10) printf("Right\n");
else if (s[12]!='X' && s[12]-'0'==sum) printf("Right\n");
else {
if (sum==10) s[12]='X';
else s[12]=sum+'0';
printf("%s\n", s);
}
return 0;
}
P1125 [NOIP2008 提高组] 笨小猴
#include <cstdio>
#include <algorithm>
using namespace std;
char s[105];
int cnt[30];
int main()
{
scanf("%s", s);
for (int i = 0; s[i] != '\0'; i++) cnt[s[i] - 'a']++;
int maxn = 0, minn = 105;
for (int i = 0; i < 26; ++i) {
if (cnt[i] > 0) {
maxn = max(maxn, cnt[i]);
minn = min(minn, cnt[i]);
}
}
int num = maxn - minn;
int flag = 1;
for (int i = 2; i * i <= num; i++) {
if (num % i == 0) {
flag = 0;
break;
}
}
if (num == 1 || num == 0) flag = 0;
if (flag == 1) printf("Lucky Word\n%d\n", num);
else printf("No Answer\n0\n");
return 0;
}
P1957 口算练习题
#include <cstdio>
#include <cstring>
char s[10], ans[30];
int main()
{
int i;
scanf("%d", &i);
int op = 0;
while (i--) {
int a, b;
scanf("%s", s);
if (s[0] >= 'a') {
scanf("%d%d", &a, &b);
op = s[0] - 'a' + 1;
} else {
sscanf(s, "%d", &a);
scanf("%d", &b);
}
if (op == 1) sprintf(ans, "%d+%d=%d", a, b, a + b);
if (op == 2) sprintf(ans, "%d-%d=%d", a, b, a - b);
if (op == 3) sprintf(ans, "%d*%d=%d", a, b, a * b);
printf("%s\n%d\n", ans, strlen(ans));
}
return 0;
}
P1308 [NOIP2011 普及组] 统计单词数
#include <iostream>
#include <string>
using namespace std;
int main()
{
string word;
getline(cin, word);
for (int i = 0; i < word.length(); i++)
if (word[i] >= 'A' && word[i] <= 'Z') word[i] += 'a' - 'A';
word = " " + word + " ";
string s;
getline(cin, s);
for (int i = 0; i < s.length(); i++)
if (s[i] >= 'A' && s[i] <= 'Z') s[i] += 'a' - 'A';
s = " " + s + " ";
int pos = s.find(word, pos + 1), cnt = 0, ans = 0;
while (pos != -1) {
if (cnt == 0) ans = pos;
++cnt;
pos = s.find(word, pos + 1);
}
if (cnt) cout << cnt << " " << ans << "\n";
else cout << "-1\n";
return 0;
}
P1553 数字反转(升级版)
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s;
cin >> s;
if (int(s.find('.')) != -1) {
int idx = s.find('.');
int bg = idx - 1;
while (bg >= 0 && s[bg] == '0') --bg;
if (bg < 0) cout << "0";
for (int i = bg; i >= 0; --i) cout << s[i];
cout << ".";
bg = idx + 1;
while (bg < s.length() && s[bg] == '0') ++bg;
if (bg == s.length()) cout << "0";
for (int i = int(s.length()) - 1; i >= bg; --i) cout << s[i];
cout << endl;
} else if (int(s.find('/')) != -1) {
int idx = s.find('/');
int bg = idx - 1;
while (bg >= 0 && s[bg] == '0') --bg;
if (bg < 0) cout << "0";
for (int i = bg; i >= 0; --i) cout << s[i];
cout << "/";
bg = int(s.length()) - 1;
while (bg > idx && s[bg] == '0') --bg;
if (bg == idx) cout << "0";
for (int i = bg; i > idx; --i) cout << s[i];
cout << endl;
} else if (int(s.find('%')) != -1) {
int idx = s.find('%');
int bg = idx - 1;
while (bg >= 0 && s[bg] == '0') --bg;
if (bg < 0) cout << "0";
for (int i = bg; i >= 0; --i) cout << s[i];
cout << "%\n";
} else {
int bg = int(s.length()) - 1;
while (bg >= 0 && s[bg] == '0') --bg;
if (bg < 0) cout << "0";
for (int i = bg; i >= 0; --i) cout << s[i];
cout << endl;
}
return 0;
}
- 本题输入的“数字”最多可以达到 20 位,解决本题应从字符串角度考虑
P1598 垂直柱状图
#include <cstdio>
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int cnt[30];
int main()
{
for (int i = 0; i < 4; ++i) {
string line;
getline(cin, line);
for (int j = 0; j < line.length(); ++j)
if (line[j] >= 'A' && line[j] <= 'Z') ++cnt[line[j] - 'A'];
}
int max_height = 0;
for (int i = 0; i < 26; ++i) max_height = max(max_height, cnt[i]);
for (int i = max_height; i >= 1; --i) {
int ed = 25;
for (; ed >= 0; --ed) if (cnt[ed] >= i) break;
for (int j = 0; j <= ed; ++j)
printf("%c%c", cnt[j] >= i ? '*' : ' ', j == ed ? '\n' : ' ');
}
for (int i = 0; i < 26; ++i) printf("%c%c", 'A' + i, i == 25 ? '\n' : ' ');
return 0;
}
- 本题对输出图案的要求是每一行最后一个 * 之后没有任何多余字符,因此输出时先去找每一行最后一个 * 对应的字母,再考虑从头输出到这个字母为止