洛谷试炼场1-5---简单字符串【字符串】

P1055 ISBN号码

https://www.luogu.org/problemnew/show/P1055

题意:一个ISBN号码形如x-xxx-xxxxx-c,将ISBN号码中的前九个数字按顺序分别乘上1,2,3,...,9之后相加取模11得到c。问给出的c是否合法,若不合法输出合法的ISBN号码。

思路:要注意结果为10时,应该输出X。

 1 #include <iostream>
 2 #include <set>
 3 #include <cmath>
 4 #include <stdio.h>
 5 #include <cstring>
 6 #include <algorithm>
 7 #include <vector>
 8 #include <queue>
 9 #include <map>
10 using namespace std;
11 typedef long long LL;
12 #define inf 0x7f7f7f7f
13 
14 char s[15];
15 
16 int main()
17 {
18     scanf("%s", s);
19     int ans = 0;
20     ans += s[0] - '0';
21     for(int i = 2; i <= 4; i++){
22         ans += (s[i] - '0') * i;
23     }
24     for(int i = 5; i <= 9; i++){
25         ans += (s[i + 1] - '0') * i;
26     }
27     if((ans % 11) == s[12] - '0'){
28         printf("Right
");
29     }
30     else if((ans % 11) == 10 && s[12] == 'X'){
31         printf("Right
");
32     }
33     else{
34         for(int i = 0; i <= 11; i++){
35             printf("%c", s[i]);
36         }
37         if((ans % 11) == 10){
38             printf("X
");
39         }
40         else{
41             printf("%c
", (ans % 11) + '0');
42         }
43     }
44     return 0;
45 }
View Code

P1200 你的飞碟在这儿

https://www.luogu.org/problemnew/show/P1200

题意:给两个字符串,问字符串中各个字符表示的值之积取模47是否相同。

思路:WA了一次是因为没注意到字符串不一定是6位的。

 1 #include <iostream>
 2 #include <set>
 3 #include <cmath>
 4 #include <stdio.h>
 5 #include <cstring>
 6 #include <algorithm>
 7 #include <vector>
 8 #include <queue>
 9 #include <map>
10 using namespace std;
11 typedef long long LL;
12 #define inf 0x7f7f7f7f
13 
14 char ufo[10], group[10];
15 
16 int main()
17 {
18     scanf("%s", ufo);
19     scanf("%s", group);
20     LL ansu = 1;
21     int lenu = strlen(ufo), leng = strlen(group);
22     for(int i = 0; i < lenu; i++){
23         ansu = ansu * (ufo[i] - 'A' + 1) % 47;
24     }
25     LL ansg = 1;
26     for(int i = 0; i < leng; i++){
27         ansg = ansg * (group[i] - 'A' + 1) % 47;
28     }
29     if(ansu == ansg){
30         printf("GO
");
31     }
32     else{
33         printf("STAY
");
34     }
35     return 0;
36 }
View Code

P1308 统计单词数

https://www.luogu.org/problemnew/show/P1308

题意:给一个单词,下一行给一串由单词和空格组成的文章。问这个单词在文章中出现的次数已经单词第一次出现时在第一个字符在文章中的下标。

思路:这道题的输入真的是很麻烦。学习到了使用scanf("%[^ ]", article);[]中给出的是格式符,^ 就表示读到 结束,而scanf("%[a-zA-Z0-9]",str)表示只匹配输入是大小写字母和数字,遇到非数字和字母时输入结束。读入文章之后,再根据空格划分单词,使用strcmp进行比较

 1 #include <iostream>
 2 #include <set>
 3 #include <cmath>
 4 #include <stdio.h>
 5 #include <cstring>
 6 #include <algorithm>
 7 #include <vector>
 8 #include <queue>
 9 #include <map>
10 using namespace std;
11 typedef long long LL;
12 #define inf 0x7f7f7f7f
13 
14 char word[15], article[1000005], tmp[15];
15 
16 int main()
17 {
18     //freopen("in.txt", "r", stdin);
19     scanf("%s", word);
20     int lenw = strlen(word);
21     for(int i = 0; i < lenw; i++){
22         if(word[i] >= 'A' && word[i] <= 'Z'){
23             word[i] += 32;
24         }
25     }
26     getchar();
27 
28     scanf("%[^
]", article);
29     int lena = strlen(article);
30     int j = 0, cnt = 0, mini = -1;
31     //bool flag = true;
32     for(int i = 0; i < lena; i++){
33         if(article[i] >= 'A' && article[i] <= 'Z'){
34             article[i] += 32;
35         }
36         if(article[i] == ' '){
37             //printf("%s
", tmp);
38             //tmp[j] = 0;
39             if(strcmp(tmp, word) == 0){
40                 cnt++;
41                 if(mini == -1){
42                     mini = i - lenw;
43                 }
44             }
45             j = 0;
46             memset(tmp, 0, sizeof(tmp));
47         }
48         else{
49             tmp[j++] = article[i];
50         }
51     }
52     //printf("%s
", tmp);
53     if(strcmp(tmp, word) == 0){
54         cnt++;
55         if(mini == -1){
56             mini = lena - 1 - lenw;
57         }
58     }
59 
60     if(cnt){
61         printf("%d %d
", cnt, mini);
62     }
63     else{
64         printf("-1
");
65     }
66     return 0;
67 }
View Code

P1553 数字反转(升级版)

https://www.luogu.org/problemnew/show/P1553

思路:暴力模拟一下。注意处理前导零,小数部分和整数部分不同,前导零是要的,末尾的零是不要的。

  1 #include <iostream>
  2 #include <set>
  3 #include <cmath>
  4 #include <stdio.h>
  5 #include <cstring>
  6 #include <algorithm>
  7 #include <vector>
  8 #include <queue>
  9 #include <map>
 10 using namespace std;
 11 typedef long long LL;
 12 #define inf 0x7f7f7f7f
 13 
 14 char s[25], revs[25];
 15 
 16 int main()
 17 {
 18     scanf("%s", s);
 19     int fenshu = -1, xiaoshu = -1;
 20     bool allzero = true, allzero2 = true;
 21     int n = strlen(s);
 22     if(s[n - 1] == '%'){
 23         for(int i = n - 2, j = 0; i >= 0;i--, j++){
 24             revs[j] = s[i];
 25             if(s[i] - '0'){
 26                 allzero = false;
 27             }
 28         }
 29         if(allzero){
 30             printf("0%
");
 31         }
 32         else{
 33             revs[n - 1] = '%';
 34             bool flag = true;
 35             for(int i = 0; i < n; i++){
 36                 if(revs[i] == '0' && flag)continue;
 37                 if(revs[i] != '0' && flag)flag = false;
 38                 printf("%c", revs[i]);
 39             }
 40             printf("
");
 41         }
 42         return 0;
 43     }
 44 
 45     for(int i = 0; i < n; i++){
 46         if(s[i] == '.'){
 47             xiaoshu = i;
 48         }
 49         else if(s[i] == '/'){
 50             fenshu = i;
 51         }
 52         else if(s[i] != '0'){
 53             if(xiaoshu != -1 || fenshu != -1){
 54                 allzero2 = false;
 55             }
 56             else{
 57                 allzero = false;
 58             }
 59         }
 60     }
 61     //cout<<allzero<<endl;
 62 
 63     if(fenshu == -1 && xiaoshu == -1){
 64         if(allzero){
 65             printf("0
");
 66         }
 67         else{
 68             for(int i = n - 1, j = 0; i >= 0; i--, j++){
 69                 revs[j] = s[i];
 70             }
 71             bool flag = true;
 72             for(int i = 0; i < n; i++){
 73                 if(revs[i] == '0' && flag)continue;
 74                 if(revs[i] != '0' && flag)flag = false;
 75                 printf("%c", revs[i]);
 76             }
 77             printf("
");
 78         }
 79 
 80     }
 81     else if(fenshu != -1){
 82         int j = 0;
 83         for(int i = fenshu - 1; i >= 0; i--, j++){
 84             revs[j] = s[i];
 85         }
 86         revs[j++] = '/';
 87         for(int i = n - 1; i>= fenshu + 1; i--, j++){
 88             revs[j] = s[i];
 89         }
 90         if(allzero){
 91             printf("0");
 92         }
 93         else{
 94             bool flag = true;
 95             for(int i = 0; i < fenshu; i++){
 96                 if(revs[i] == '0' && flag)continue;
 97                 if(revs[i] != '0' && flag)flag = false;
 98                 printf("%c", revs[i]);
 99             }
100         }
101         printf("/");
102         if(allzero2 = 0){
103             printf("0");
104         }
105         else{
106             bool flag = true;
107             for(int i = fenshu + 1; i < n; i++){
108                 if(revs[i] == '0' && flag)continue;
109                 if(revs[i] != '0' && flag)flag = false;
110                 printf("%c", revs[i]);
111             }
112         }
113         printf("
");
114     }
115     else{
116         int j = 0;
117         for(int i = xiaoshu - 1; i >= 0; i--, j++){
118             revs[j] = s[i];
119         }
120         revs[j++] = '.';
121         for(int i = n - 1; i >= xiaoshu + 1; i--, j++){
122             revs[j] = s[i];
123         }
124 
125         if(allzero){
126             printf("0");
127         }
128         else{
129             bool flag = true;
130             for(int i = 0; i < xiaoshu; i++){
131                 if(revs[i] == '0' && flag)continue;
132                 if(revs[i] != '0' && flag)flag = false;
133                 printf("%c", revs[i]);
134             }
135         }
136         printf(".");
137         if(allzero2){
138             printf("0");
139         }
140         else{
141             int zero = n - 1;
142             for(int i = n - 1; i >= xiaoshu + 1; i--){
143                 if(revs[i] != '0'){
144                     break;
145                 }
146                 else{
147                     zero--;
148                 }
149             }
150             for(int i = xiaoshu + 1; i <= zero; i++){
151                 printf("%c", revs[i]);
152             }
153         }
154         printf("
");
155     }
156     return 0;
157 }
View Code

P1598 垂直柱状图

https://www.luogu.org/problemnew/show/P1598

思路:乍一看输出好麻烦啊,不知道怎么弄。暴力输出就好了。用scanf("%[^ ]", s);循环整行读入的时候记得要先getchar把换行符给读掉。

 1 #include <iostream>
 2 #include <set>
 3 #include <cmath>
 4 #include <stdio.h>
 5 #include <cstring>
 6 #include <algorithm>
 7 #include <vector>
 8 #include <queue>
 9 #include <map>
10 using namespace std;
11 typedef long long LL;
12 #define inf 0x7f7f7f7f
13 
14 int cnt[26];
15 char s[105];
16 
17 int main()
18 {
19     int maxn = -1;
20     for(int i = 0; i < 4; i++){
21         scanf("%[^
]", s);
22         int n = strlen(s);
23         for(int j = 0; j < n; j++){
24             if(s[j] >= 'A' && s[j] <= 'Z'){
25                 cnt[s[j] - 'A']++;
26                 maxn = max(maxn, cnt[s[j] - 'A']);
27             }
28         }
29         getchar();
30     }
31 
32     for(int i = maxn; i >= 1; i--){
33         for(int ch = 0; ch < 25; ch++){
34             if(cnt[ch] >= i){
35                 printf("* ");
36             }
37             else{
38                 printf("  ");
39             }
40         }
41         if(cnt[25] >= i){
42             printf("*
");
43         }
44         else{
45             printf(" 
");
46         }
47     }
48     for(int i = 0; i < 25; i++){
49         printf("%c ", i + 'A');
50     }
51     printf("Z
");
52     return 0;
53 }
View Code

P1914 小书童——密码

https://www.luogu.org/problemnew/show/P1914

思路:要注意取模防溢出。

 1 #include <iostream>
 2 #include <set>
 3 #include <cmath>
 4 #include <stdio.h>
 5 #include <cstring>
 6 #include <algorithm>
 7 #include <vector>
 8 #include <queue>
 9 #include <map>
10 using namespace std;
11 typedef long long LL;
12 #define inf 0x7f7f7f7f
13 
14 int n;
15 char s[55];
16 
17 int main()
18 {
19     scanf("%d", &n);
20     scanf("%s", s);
21     int len = strlen(s);
22     for(int i = 0; i < len; i++){
23         printf("%c", (s[i] - 'a' + n) % 26 + 'a');
24     }
25     printf("
");
26     return 0;
27 }
View Code
原文地址:https://www.cnblogs.com/wyboooo/p/9839833.html