2.2 字符串 参考代码

RonChen / 2023-07-25 / 原文

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;
}
  • 本题对输出图案的要求是每一行最后一个 * 之后没有任何多余字符,因此输出时先去找每一行最后一个 * 对应的字母,再考虑从头输出到这个字母为止