7-1 | 统计大写辅音字母 |
7-2 | 统计字符出现次数 |
7-3 | 字符串逆序 |
7-4 | 字符串字母大小写转换 |
7-5 | 查找指定字符 |
7-6 | 字符串转换成十进制整数 |
7-7 | 输出大写英文字母 |
7-8 | 删除重复字符 |
7-9 | 字符串替换 |
7-10 | 字符转换 |
7-11 | 字符串循环左移 |
7-12 | Q进制转换成T进制 |
所有题目都只需要 #include
int main() {
char ch;
int cnt = 0;
while((ch = getchar()) != '\n') // "!=" 优先级比 "=" 高,所以需要小括号
if(ch >= 'B' && ch <= 'Z' && ch != 'E' && ch != 'I' && ch != 'O' && ch != 'U')
++cnt;
printf("%d\n", cnt);
return 0;
}
int main() {
int cur = 0, cnt = 0;
char str[80];
char ch, target;
while((ch = getchar()) != '\n') // 因为是后输入要找的字符,所以只能先全读到字符数组中
str[cur++] = ch;
scanf("%c", &target);
for(int i = 0; i < cur; i++)
if(target == str[i])
++cnt;
printf("%d\n", cnt);
return 0;
}
int main() {
int cur = 0;
char str[81], ch;
while((ch = getchar()) != '\n')
str[cur++] = ch;
for(int i = cur - 1; i >= 0; i--)
printf("%c", str[i]);
return 0;
}
int main() {
char ch;
while((ch = getchar()) != '#') {
if(ch >= 'a' && ch <= 'z') printf("%c", ch + 'Z' - 'z');
else if(ch >= 'A' && ch <= 'Z') printf("%c", ch - 'Z' + 'z');
else printf("%c", ch);
}
return 0;
}
需要注意的是,用getchar(),把第一行后边的空格读掉。
int main() {
char ch, target;
int idx = -1, cur = 0;
scanf("%c", &target);
getchar();
while((ch = getchar()) != '\n') {
if(ch == target) idx = cur;
++cur;
}
if(idx == -1) printf("Not Found\n");
else printf("index = %d\n", idx);
return 0;
}
这道题要判断每个字符是不是16进制字符,因为不区别大小写,所以需要判断三种情况,还需要判断 '-' 是不是出现在第一个十六进制字符前边。判断好这两个就解决了。
int main() {
int flaghex = 0, minus = 0; // 是否已经出现过16进制字符,是否是负数
int sum = 0;
char ch;
while((ch = getchar()) != '#') {
if(ch >= '0' && ch <= '9') {
flaghex = 1;
sum = sum * 16 + (ch - '0');
}
else if(ch >= 'a' && ch <= 'f') {
flaghex = 1;
sum = sum * 16 + (ch - 'a') + 10;
}
else if(ch >= 'A' && ch <= 'F') {
flaghex = 1;
sum = sum * 16 + (ch - 'A') + 10;
}
else if(ch == '-' && flaghex == 0) // '-'出现在第一个十六进制数前边
minus = 1;
}
if(minus == 1) printf("%d\n", -sum);
else printf("%d\n", sum);
return 0;
}
只需要用一个数组记录一下26个字母是否出现过就行了。
int main() {
static int alp[26]; // 全部初始化为0,表示26个字母是否出现过
int flag = 0; // 为判断 Not Found
char ch;
while((ch = getchar()) != '\n') {
if(ch > 'Z' || ch < 'A') continue; // 不是就跳过
if(alp[ch - 'A'] == 0) { // 还没出现过
printf("%c", ch);
alp[ch - 'A'] = 1;
flag = 1;
}
}
if(flag == 0) printf("Not Found\n");
return 0;
}
每次读进来一个字符,在已经存起来的数组里边找并找合适位置插入,如果找到了相同的,就跳过,因为重复了。
int main() {
char res[82], ch;
int cur = 0;
while ((ch = getchar()) != '\n') {
int flag = 0; // 判断是否出现过,或者成功插入了
for (int i = 0; i < cur; i++) {
if (res[i] == ch) { // 出现过,直接跳过
flag = 1;
break;
}
if (res[i] > ch) { // ascii 码的比较, 插入在这个位置前边
for (int j = cur; j > i; j--) // i右边所有元素右移一位
res[j] = res[j - 1];
res[i] = ch; // ch 插入到i位置
++cur; // res大小加一
flag = 1;
break;
}
}
if (flag == 0) // 没有出现过,而且res里都比ch小
res[cur++] = ch; // res大小加一
}
// 按序输出res即可
for (int i = 0; i < cur; i++)
printf("%c", res[i]);
return 0;
}
用一个26大小数组表示字母表,比如 alp[1] 就代表 ‘B’ ,然后如果是大小英文字母,就把他对应的位置 i 变成 25 - i 就行了,对应位置上就是他要变成的大小字母。
int main() {
char alp[27] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // 最后一位是 '\0'
char ch;
while ((ch = getchar()) != '\n') {
if (ch >= 'A' && ch <= 'Z')
printf("%c", alp[25 - (ch - 'A')]);
else
printf("%c", ch);
}
return 0;
}
int main() {
int sum = 0;
char ch;
while ((ch = getchar()) != '\n')
if(ch >= '0' && ch <= '9')
sum = sum * 10 + (ch - '0');
printf("%d\n", sum);
return 0;
}
读入字符串,然后先输出后半部分,在输出前半部分就行了。
int main() {
char str[101], ch;
int cur = 0, N;
while ((str[cur++] = getchar()) != '\n');
--cur; // 最后的 '\n' 被读进来,要扔掉
scanf("%d", &N);
N %= cur;
// 先输出后边的,然后输出前边的
for (int i = N; i < cur; i++) printf("%c", str[i]);
for (int i = 0; i < N; i++) printf("%c", str[i]);
return 0;
}
这道题两个进制都是 2 到 10 之间所以难度不大,如果有16进制这种的,就会麻烦一些了。
int main() {
int Q, T, sum = 0;
scanf("%d", &Q);
getchar(); // 要读掉回车
char ch;
while ((ch = getchar()) != '\n')
if (ch >= '0' && ch <= ('0' + Q - 1)) // 其他字符都过滤掉,2进制可取值为0和1,没有2
sum = sum * Q + (ch - '0'); // sum为Q进制转为10进制
if (sum == 0) {
printf("0\n");
return 0;
}
scanf("%d", &T);
if (T == 10) { // 转成十进制的话直接输出就行
printf("%d\n", sum);
return 0;
}
// 下面是10进制数sum转为T进制
int cur = 0, a[100000];
while (sum != 0) {
a[cur++] = sum % T;
sum /= T;
}
for (int i = cur - 1; i >= 0; i--)
printf("%d", a[i]);
return 0;
}