C语言密码破译China问题

要将"China"译成密码,译码规律是:用原来字母后面的第4个字母代替原来的字母.

例如,字母"A"后面第4个字母是"E"."E"代替"A"。因此,"China"应译为"Glmre"。

请编一程序,用赋初值的方法使cl、c2、c3、c4、c5五个变量的值分别为,’C’、’h’、’i’、’n’、’a’,经过运算,使c1、c2、c3、c4、c5分别变为’G’、’l’、’m’、’r’、’e’,并输出。

首先这个题目由于测试数据是China是有题目本身就给出的,可以直接这样回答:

#include"stdio.h"
int main()
{
    char ch1,ch2,ch3,ch4,ch5;
    scanf("%c",&ch1);
    scanf("%c",&ch2);
    scanf("%c",&ch3);
    scanf("%c",&ch4);
    scanf("%c",&ch5);
    printf("%c%c%c%c%c",ch1+4,ch2+4,ch3+4,ch4+4,ch5+4);
    return 0;
}

但是我们要尽可能寻求更加普遍的一个算法,以至于让我们自己输入的时候,也能保证每个字母都可以加4之后,准确输出,应该怎么办呢?

其实应该考虑的字母只有四个,w x y z,我们知道,在26个英文子母中,a与a的距离是零,b与a的距离是1,z与a的距离是25,所以26个英文字母和a距离的范围是0~25,且用自身的ASCII码减去a的ASCII码就是与字母a的距离,但是w加上4之后再减去a的ASCII码就是26了,与a距离是26的字母?我们刚刚已经说过了,最大与a的距离也就是25,这里的26应该怎么理解,我们实际上知道w加上4之后就应该是a,0~25是26个英文字母,26~51是下一轮26个英文字母,这里的26不妨理解成下一轮循环的第一个,也就是a,26与26距离为0,所以26就是a,同样x加上4减去a的ASCII码后就是27,减去26后剩下1,所以就是距离a一个位置,就是b了,

#include 
int main()
{
    char s[11];                             //定义一个长度为10的字符串(注意有结尾符)
    gets(s);                                //输入字符串
    for (int i = 0; s[i] != '\0'; i++)      //循环到结尾符'\0'时停止循环
    {
        if (s[i] >= 'A' && s[i] <= 'Z')             //判断是否为大写字母
        {
            s[i] = (s[i] + 4 - 'A') % 26 + 'A';     //大写字母后移
        }
        if (s[i] >= 'a' && s[i] <= 'z')             //判断是否为小写字母A
        {
            s[i] = (s[i] + 4 - 'a') % 26 + 'a';     //小写字母后移
        }
    }
    puts(s);                                //输出字符串
    return 0;
}

当然了,这里还可以进入更深入的思考,就是我们考虑字母并不是向后移动4位,而是移动更大数目,这时候就不是第二轮循环了,就可能是第三轮第四轮循环,这种思路在数据结构的队列中有出现,建议继续学习数据结构的小伙伴将此题目收藏起来,到时候会有更大收获

你可能感兴趣的:(c语言)