2020年1月10日 星期五

凱薩加密

題目:
凱薩加密是最廣為人知的古老加密法之一,由尤利烏斯·凱撒發明。此方法透過把訊息的每一個字母由固定順位後的另一個字母取代加密。(如果代替的字母超出Z,則加密會回到字母表的開頭。例如如果每一個字母由後兩位的字母取代,那Y會被A取代,Z會被B取代。)寫一個程式用凱薩加密法加密。使用者會輸入待加密訊息與移動順位(字母要被移動的數目)。

輸入:
輸入包含兩行,第一行是待加密的訊息,已知不會超過80個字元。
第二行則是順移數目。

輸出:
輸出加密後的訊息。非字母的字元無須轉換。小寫字母需維持小寫,大寫字母依然大寫。

範例輸出:





解題思路:
這題不能用scanf("%s",sentence),因為%s遇到空白就會停止。可以用getchar()或gets()。

加密部分把大小寫分開討論,然後消除字母的部分單純看成1~26的數字在裡面移動(也就是先減去一個a/A),使用%來限制數字只能在1~26之內,最後再把字母加回去。

程式碼:
#include<stdio.h>
int main()
{
 int i = 0, n = 0;
 char sentence[100] = { '\0' }, ch;
 printf("Enter meaasge to be encrypted:");
 while ((ch = getchar()) != '\n')
 {
  sentence[i++] = ch;
 }
 printf("Enter shift amount: ");
 scanf_s("%d", &n);
 printf("Encrypted message: ");
 for (int j = 0; j < i; j++)
 {
  if (sentence[j] >= 'a'&&sentence[j] <= 'z')
   sentence[j] = (sentence[j] - 'a' + n) % 26 + 'a';
  else if (sentence[j] >= 'A'&&sentence[j] <= 'Z')
   sentence[j] = (sentence[j] - 'A' + n) % 26 + 'A';
 }
 printf("%s\n", sentence);
 return 0;
}

沒有留言:

張貼留言