llf123456 发表于 2021-1-7 09:56:18

ball ball you

字母环形加密(增强) (10分)
将26个英文字母按顺时针方向排成一个圆环。密钥是一个整数。



具体加密方法如下:

若密钥 key≥0,则从明文字母开始按顺时针方向走 ∣key∣ 步得到密文字母;
若密钥 key<0,则从明文字母开始按逆时针方向走 ∣key∣ 步得到密文字母。
请编写函数,完成加密功能。

函数原型
char Encode(char plain, int key);
说明:参数 plain 为明文字符,key 为密钥(即步数)。若明文字符是字母,则函数值为对应的密文字母,大小写不变。若明文字符不是字母,则函数值不变。

裁判程序
#include <stdio.h>
#include <ctype.h>

char Encode(char plain, int key);

int main()
{
    char x, y;
    int k;
    scanf("%c%d", &x, &k);
    y = Encode(x, k);
    printf("%c\n", y);
    return 0;
}

/* 你提交的代码将被嵌在这里 */
输入格式
明文 密钥(任意整数)

输出格式
密文

输入样例1
x 5
输出样例1
c
输入样例2
B -3
输出样例2
Y
输入样例3
# 7
输出样例3
#


//以下是我的代码
char Encode(char plain, int key)
{
        int i;
        if(isalpha(plain)&&key>0)return plain+key;
        else if(isalpha(plain)&&key<0)return plain-key;
        else return plain;
}//无法输出

jackz007 发表于 2021-1-7 10:39:02

本帖最后由 jackz007 于 2021-1-7 12:13 编辑

char Encode(char plain , int key)
{
      int k = key                                                                            ;
      char c = plain                                                                         ;
      if(key < 0) k = - k                                                                  ;
      k = k % 26                                                                           ;
      if(k && (c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z')) {
                if(key < 0) k = - k                                                            ;
                c += k                                                                         ;
                if(k < 0 && (c > 'A' - 26 && c < 'A' || c > 'a' - 26 && c < 'a')) c += 26      ;
                else if(k > 0 && (c > 'Z' && c < 'Z' + 26 || c > 'z' && c < 'z' + 26)) c -= 26 ;
      }
      return c                                                                               ;
}

风过无痕1989 发表于 2021-1-7 11:55:16

char Encode(char plain, int key)
{
        char letter;
        letter = plain + key;
        if (plain >= 'A' && plain <= 'Z')      // 若输入的是大写字母
        {
                if (letter > 'Z')                  // 如果输入加上密钥大于字母Z
                        letter = letter - 'Z' + 'A' - 1; // 则让密文落入前面的大写字母
                else if (letter < 'A')               // 如果输入加上密钥小于字母A
                        letter = letter - 'A' + 'Z' + 1; // 则让密文落入后面的大写字母
        }
        else if(plain >= 'a' && plain <= 'z')    // 若输入的是小写字母
        {
                if (letter > 'z')                  // 如果输入加上密钥大于字母z
                        letter = letter - 'z' + 'a' - 1; // 则让密文落入前面的小写字母
                else if (letter < 'a')               // 如果输入加上密钥小于字母a
                        letter = letter - 'a' + 'z' + 1; // 则让密文落入后面的小写字母
        }
        else                                     // 若输入的不是英文字母
                letter = plain;                      // 则原文输出
        return letter;
}
页: [1]
查看完整版本: ball ball you