计算机能力挑战初赛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;
}