洛谷试炼场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。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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\n"); 29 } 30 else if((ans % 11) == 10 && s[12] == 'X'){ 31 printf("Right\n"); 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\n"); 39 } 40 else{ 41 printf("%c\n", (ans % 11) + '0'); 42 } 43 } 44 return 0; 45 }
P1200 你的飞碟在这儿
https://www.luogu.org/problemnew/show/P1200
题意:给两个字符串,问字符串中各个字符表示的值之积取模47是否相同。
思路:WA了一次是因为没注意到字符串不一定是6位的。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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\n"); 31 } 32 else{ 33 printf("STAY\n"); 34 } 35 return 0; 36 }
P1308 统计单词数
https://www.luogu.org/problemnew/show/P1308
题意:给一个单词,下一行给一串由单词和空格组成的文章。问这个单词在文章中出现的次数已经单词第一次出现时在第一个字符在文章中的下标。
思路:这道题的输入真的是很麻烦。学习到了使用scanf("%[^\n]", article);[]中给出的是格式符,^\n就表示读到\n结束,而scanf("%[a-zA-Z0-9]",str)表示只匹配输入是大小写字母和数字,遇到非数字和字母时输入结束。读入文章之后,再根据空格划分单词,使用strcmp进行比较
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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("%[^\n]", 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\n", 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\n", 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\n", cnt, mini); 62 } 63 else{ 64 printf("-1\n"); 65 } 66 return 0; 67 }
P1553 数字反转(升级版)
https://www.luogu.org/problemnew/show/P1553
思路:暴力模拟一下。注意处理前导零,小数部分和整数部分不同,前导零是要的,末尾的零是不要的。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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%\n"); 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("\n"); 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\n"); 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("\n"); 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("\n"); 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("\n"); 155 } 156 return 0; 157 }
P1598 垂直柱状图
https://www.luogu.org/problemnew/show/P1598
思路:乍一看输出好麻烦啊,不知道怎么弄。暴力输出就好了。用scanf("%[^\n]", s);循环整行读入的时候记得要先getchar把换行符给读掉。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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("%[^\n]", 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("*\n"); 43 } 44 else{ 45 printf(" \n"); 46 } 47 } 48 for(int i = 0; i < 25; i++){ 49 printf("%c ", i + 'A'); 50 } 51 printf("Z\n"); 52 return 0; 53 }
P1914 小书童——密码
https://www.luogu.org/problemnew/show/P1914
思路:要注意取模防溢出。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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("\n"); 26 return 0; 27 }