有一篇加密后的文章,由三行组成。
第一行是以空格分割的两个字符串;
第二、三行是由 大小写字母、数字、空格以及其它字符 构成的文章,称为密文正文。
请编写程序,使该程序能根据输入输出符合输出要求的内容。
请仔细阅读输出要求。
输入
符合要求的文章,可参见样例。
输出
Ⅰ.第一行:分别统计该文章中三行总共的英文大写字母、小写字母、数字、空格以及其它字符的个数。并按顺序输出,输出的数字之间以空格分割。
Ⅱ.第二行:将第一行的两个字符串进行比较(注:此比较规则不同于strcmp函数),输出比较后的值,称此值为keykeykey。
比较规则:现有两个字符串s1和s2进行比较
①若s1>s2,输出一个正数;若s1=s2,输出0;若s1<s2,输出一个负数。
②输出的正数或者负数的绝对值应是相比较的两个字符串相应字符的ASCII码的差值之和。
例如“AAA”与“CCC”相比,由于“A” < “C”,应该输出负数,因“A”与“C”的ASCII码差值为2,故应输出"−2-2−2"。
当"AAAAAA"与"CCCCCC"相比时,应输出 -2 与 -2 的和即"−4-4−4"。
同理:“AndAndAnd”和“AidAidAid”比较,根据第二个字符比较的结果,"n"比"i"大5,因此输出"555"。
当"AndAndAnd"和"CidCidCid"相比较时,应输出 -2 与 5 的和即"333".
③当两个字符串不等长时,按短的计算,即如"AndABCDEFAndABCDEFAndABCDEF"与"CidCidCid"相比较时,结果仍然为"333"。
Ⅲ.第三、四行:将密文正文进行解密,按行输出解密后的文章。
解密规则:
①将密文正文的除英文大写字母和空格以外的字符删除。
②将密文正文的所有英文大写字母按字母表顺序向后移动keykeykey个位置。
例如:若key=2key=2key=2,则字符AZAZAZ应该解密为CBCBCB ; 若key=−2key=-2key=−2,则字符AZAZAZ应该解密为YXYXYX
样例
输入
7cVvbj12TWl%HwL YJwK77YULEg^i2QwbnCb2HD 42fb5qg^cJm M^rfgPlv5Wvs^*Fpcib^gsm%4lfrn O5Vkwxm?rBr?zjgcba90uhybonyxB3fs6ab7d
输出
25 62 18 2 10 25 I LOVE NUAA
输入
AAAAA ZZZZZ X F T A XFTA
输出
18 0 0 4 0 -125 C K Y F CKYF
//以下解答已AC,但对于 不同的key 解密过于复杂,有时间看看有没有更好解法
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define STRINGLENGTH 100
char str1[STRINGLENGTH];
char str2[STRINGLENGTH];
char str3[STRINGLENGTH];
char str4[3 * STRINGLENGTH];//用来存储连接的三个串
char s1[STRINGLENGTH]; //用来放置第一个串的两个子串
char s2[STRINGLENGTH];
void count(char str[]);
void decode(char str[], int key);
int main()
{
//输入字符串
gets(str1);
gets(str2);
gets(str3);
//将三个字符串连接起来
strcat(str4, str1);
strcat(str4, str2);
strcat(str4, str3);
//统计连接后的字符串
count(str4);
//比较第一行中的两个字符串
int str1length = strlen(str1);
int flag = 1;
int j = 0;
for (int i = 0; i < str1length; i++ ) {
if (!isspace(str1[i])) //以空格为界分隔字符串
if (flag) s1[i] = str1[i];
else s2[j++] = str1[i];
else {
flag = 0;
continue;
}
}
//比较分隔的子串
int s1len = strlen(s1);
int s2len = strlen(s2);
int len = s1len > s2len ? s2len : s1len; //取字符串短的长度
int key = 0; //两子串字符差的和
for (int i = 0; i < len; i++) {
key += s1[i] - s2[i];
}
printf("%d\n", key);
//将密文正文进行解密
decode(str2, key);
printf("%s\n", s1);
decode(str3, key);
printf("%s\n", s1);
return 0;
}
//统计
void count(char str[])
{
int length;
int upper = 0; //大写字母计数
int lower = 0; //小写字母计数
int digit = 0; //数字计数
int space = 0; //空格计数
int other = 0; //其它计数
length = strlen(str);
for (int i = 0; i < length; i++) {
if (isupper(str[i]))
upper++;
else if (islower(str[i]))
lower++;
else if (isdigit(str[i]))
digit++;
else if (isspace(str[i]))
space++;
else
other++;
}
printf("%d %d %d %d %d\n", upper, lower, digit, space, other);
}
//解密
void decode(char str[] , int key)
{
int length;
int j = 0;
length = strlen(str);
for (int i = 0; i < length; i++) {
if (isupper(str[i]) || isspace(str[i])) {
s1[j++] = str[i];
} else
continue;
}
s1[j] = '\0';
//根据key值变换
int lens1 = strlen(s1);
if (key < 0) {
for (int i = 0; i < lens1; i++) {
if (isupper(s1[i])) {
char t = (s1[i] + 26 + key % 26) % 90;
if (t <= 26) s1[i] = 64 + t;
else s1[i] = s1[i] + 26 + key % 26;
}
}
} else {
for (int i = 0; i < lens1; i++) {
if (isupper(s1[i])) {
char t = s1[i] + key % 26;
if (t > 90) s1[i] = 64 +t % 90;
else s1[i] = t;
}
}
}
}