#include <stdio.h>
#include <string.h>
// (a) アルファベットかどうかを判定する関数
int isalphabet(char c) {
return (('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z'));
}
// (b) シーザー暗号の変換関数
char caesar(char c, int n) {
if (!isalphabet(c)) {
return c; // アルファベットでなければそのまま返す
}
int base = ('A' <= c && c <= 'Z') ? 'A' : 'a';
int pos = c - base; // アルファベット内での位置(0〜25)
int new_pos = (pos + n) % 26;
// 負のmod対策(C言語では -1 % 26 は -1 になるので)
if (new_pos < 0) {
new_pos += 26;
}
return base + new_pos;
}
// (c) メイン関数:暗号化と復号化のテスト
int main() {
char input[1000];
int n;
fgets(input
, sizeof(input
), stdin
); input
[strcspn(input
, "\n")] = '\0'; // 改行を削除
printf("シフト数を入力してください(例: 3): ");
// 暗号化
char encrypted[1000];
for (int i = 0; input[i] != '\0'; i++) {
encrypted[i] = caesar(input[i], n);
}
encrypted
[strlen(input
)] = '\0';
printf("暗号化結果: %s\n", encrypted
);
// 復号化
char decrypted[1000];
for (int i = 0; encrypted[i] != '\0'; i++) {
decrypted[i] = caesar(encrypted[i], -n);
}
decrypted
[strlen(encrypted
)] = '\0';
printf("復号化結果: %s\n", decrypted
);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCi8vIChhKSDjgqLjg6vjg5XjgqHjg5njg4Pjg4jjgYvjganjgYbjgYvjgpLliKTlrprjgZnjgovplqLmlbAKaW50IGlzYWxwaGFiZXQoY2hhciBjKSB7CiAgICByZXR1cm4gKCgnQScgPD0gYyAmJiBjIDw9ICdaJykgfHwgKCdhJyA8PSBjICYmIGMgPD0gJ3onKSk7Cn0KCi8vIChiKSDjgrfjg7zjgrbjg7zmmpflj7fjga7lpInmj5vplqLmlbAKY2hhciBjYWVzYXIoY2hhciBjLCBpbnQgbikgewogICAgaWYgKCFpc2FscGhhYmV0KGMpKSB7CiAgICAgICAgcmV0dXJuIGM7ICAvLyDjgqLjg6vjg5XjgqHjg5njg4Pjg4jjgafjgarjgZHjgozjgbDjgZ3jga7jgb7jgb7ov5TjgZkKICAgIH0KCiAgICBpbnQgYmFzZSA9ICgnQScgPD0gYyAmJiBjIDw9ICdaJykgPyAnQScgOiAnYSc7CiAgICBpbnQgcG9zID0gYyAtIGJhc2U7ICAgICAgICAvLyDjgqLjg6vjg5XjgqHjg5njg4Pjg4jlhoXjgafjga7kvY3nva7vvIgw44CcMjXvvIkKICAgIGludCBuZXdfcG9zID0gKHBvcyArIG4pICUgMjY7CgogICAgLy8g6LKg44GubW9k5a++562W77yIQ+iogOiqnuOBp+OBryAtMSAlIDI2IOOBryAtMSDjgavjgarjgovjga7jgafvvIkKICAgIGlmIChuZXdfcG9zIDwgMCkgewogICAgICAgIG5ld19wb3MgKz0gMjY7CiAgICB9CgogICAgcmV0dXJuIGJhc2UgKyBuZXdfcG9zOwp9CgovLyAoYykg44Oh44Kk44Oz6Zai5pWw77ya5pqX5Y+35YyW44Go5b6p5Y+35YyW44Gu44OG44K544OICmludCBtYWluKCkgewogICAgY2hhciBpbnB1dFsxMDAwXTsKICAgIGludCBuOwoKICAgIHByaW50Zigi5paH5a2X5YiX44KS5YWl5Yqb44GX44Gm44GP44Gg44GV44GEOiAiKTsKICAgIGZnZXRzKGlucHV0LCBzaXplb2YoaW5wdXQpLCBzdGRpbik7CiAgICBpbnB1dFtzdHJjc3BuKGlucHV0LCAiXG4iKV0gPSAnXDAnOyAvLyDmlLnooYzjgpLliYrpmaQKCiAgICBwcmludGYoIuOCt+ODleODiOaVsOOCkuWFpeWKm+OBl+OBpuOBj+OBoOOBleOBhO+8iOS+izogM++8iTogIik7CiAgICBzY2FuZigiJWQiLCAmbik7CgogICAgLy8g5pqX5Y+35YyWCiAgICBjaGFyIGVuY3J5cHRlZFsxMDAwXTsKICAgIGZvciAoaW50IGkgPSAwOyBpbnB1dFtpXSAhPSAnXDAnOyBpKyspIHsKICAgICAgICBlbmNyeXB0ZWRbaV0gPSBjYWVzYXIoaW5wdXRbaV0sIG4pOwogICAgfQogICAgZW5jcnlwdGVkW3N0cmxlbihpbnB1dCldID0gJ1wwJzsKCiAgICBwcmludGYoIuaal+WPt+WMlue1kOaenDogJXNcbiIsIGVuY3J5cHRlZCk7CgogICAgLy8g5b6p5Y+35YyWCiAgICBjaGFyIGRlY3J5cHRlZFsxMDAwXTsKICAgIGZvciAoaW50IGkgPSAwOyBlbmNyeXB0ZWRbaV0gIT0gJ1wwJzsgaSsrKSB7CiAgICAgICAgZGVjcnlwdGVkW2ldID0gY2Flc2FyKGVuY3J5cHRlZFtpXSwgLW4pOwogICAgfQogICAgZGVjcnlwdGVkW3N0cmxlbihlbmNyeXB0ZWQpXSA9ICdcMCc7CgogICAgcHJpbnRmKCLlvqnlj7fljJbntZDmnpw6ICVzXG4iLCBkZWNyeXB0ZWQpOwoKICAgIHJldHVybiAwOwp9Cg==