计算机能力挑战初赛2020.17题
题目描述:
有一组均由字符A~Z和a~z组成的字符串,其中要求将字符串中各字符按如下要求进行转换:
A<->z、B<->y、C<->x、...... 、X<->c、Y<->b、Z<->a
输入: 第一行输入字符串(长度<=10000)
输出: 输出转换之后的字符串。
样例输入: Algorithm
样例输出: zOTLIRGSN
样例输入: Hello
样例输出: sVOOL
题目分析:
显然将输入的字符转化为ASCII码,
根据观察得出输入的字符ASCII码 = 187 - 输出的字符ASCII码。
int main(void) {
char str_1[5000];/*str_1表示输入的字符串*/
scanf("%s", str_1);/*输入字符串*/
char str_2[5000];
/*for (int i = 0; p != 0; i++) {
str_2[i] = 187 - str_1[i];
p++;
};*/
for (int i = 0; i <= strlen(str_1); i++) {
if (i < strlen(str_1)) {
str_2[i] = 187 - str_1[i];
}
else {
str_2[i] = 0;
}
}
printf("%s", str_2);
return 0;
}
但是还不够,定义的字符串长度是有限的,使用动态顺序表让输入可以无限长。
最终代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void) {
/*str_1表示输入的字符串*/
char* str_1 = NULL;
int capacity = 5;
int size = 0;
str_1 = (char*)malloc(capacity * sizeof(char));
int flag = 0;
for(int i = 0;flag == 0;i++){
if (size == capacity) {
int newcapacity = capacity * 2;
char * str = (char*)realloc(str_1,newcapacity * sizeof(char));
str_1 = str;
capacity = newcapacity;
}
str_1[i] = getchar();/*输入字符串*/
size++;
if (str_1[i] == '\n') {
flag = 1;
str_1[i] = 0;/*str_1由字符数组转为字符串*/
}
}
char* str_2 = NULL;
str_2 = (char*)malloc(size * sizeof(char));
for (int i = 0; i <= strlen(str_1); i++) {
if (i < strlen(str_1)) {
str_2[i] = 187 - str_1[i];
}
else {
str_2[i] = 0;
}
}
printf("%s", str_2);
free(str_1);
str_1 = NULL;
free(str_2);
str_2 = NULL;
return 0;
}