1. 程式人生 > >加密每個字元依次反覆加上“4962873”中的數字,範圍超過ASCII碼的032(空格)~122(“z”),則進行模運算,然後解密。

加密每個字元依次反覆加上“4962873”中的數字,範圍超過ASCII碼的032(空格)~122(“z”),則進行模運算,然後解密。

Problem description
  編寫程式,將輸入的一行字元加密和解密。加密時,每個字元依次反覆加上“4962873”中的數字,如果範圍超過ASCII碼的032(空格)~122(“z”),則進行模運算。解密與加密的順序相反。編制加密與解密函式,列印各個過程的結果。
Input
  第一行是一個整數T,表示有T組資料。每組資料一行,為一字串,長度不超過1000個字元。
Output
  對於每一組資料,先輸出“Case #:”(#為序號,從1起),換行;然後輸出加密的結果,空一行,再輸出解密後的結果,換行。

此題花了好多時間,開始的時候就是直接加密輸出,然後再輸出一遍源字串,結果就一直Wrong Answer.
所以,絕對不能偷懶,解密函式也要寫,因為題目並沒有說解密後和源字串一致

。所以,不要帶自己的觀念進入題中!!!

程式碼如下:

#include<stdio.h>
#include<string.h>
void encrypt(char *song,const int *key)
{
    int i,tmp;
    for(i = 0 ; i < strlen(song); i++)
    {
        tmp = (int)song[i]+key[i%7];
        if(tmp > 122)
            song[i] = (char)(tmp%91);
        else
            song[i] = (char)tmp;

    }
}
void decrypt(char *song,const int *key)
{
    int i,tmp;
    for(i = 0 ; i < strlen(song); i++)
    {
        tmp = (int)song[i]-key[i%7];
        if(tmp < 32)
            song[i] = (char)(tmp+91);
        else
            song[i] = (char)tmp;

    }
}
int main()
{
    int T,i,n = 1,tmp;
    char song[1024];
    int key[7]={4,9,6,2,8,7,3};
    scanf("%d",&T);
    getchar();
    while(T--)
    {
        memset(song,0,sizeof(song));
        gets(song);
        printf("Case %d:\n",n++);
        encrypt(song,key);
        printf("%s\n\n",song);
        decrypt(song,key);
        printf("%s\n",song);
    }
    return 0;
}