在 C 中使用简单的 Cesar 密码
Working in Simple Cesar Cipher in C
我在大学的一个项目中工作,他们使用像典型的 Cesar Cipher 这样的问题。它更像是一个函数式程序,需要是最基本的。
该程序将从 65
到 90
的用户接收一个数字,例如当用户插入 65
时将显示 68
。将添加 3
个数字,但当用户输入 90
时,将输入 67
。 90+3 ---->90,65,66,67
。这是一个从65
到90
的循环。
#include <stdio.h>
int cesar_encrypted(int x)
{
return (x+3);
}
void test_cesar_encrypted(void)
{
int x;
scanf("%d", &x);
int z = cesar_encrypted(x);
printf("%s\n", z);
}
int main(){
test_cesar_basic();
}
我做了这个示例代码,但我们只能更进一步,如果你给90
他会给93
我要67
。
谁能帮我把它换成 90 左右?
使用模运算%
来定义想要的区间的上限和
然后使用加法 +
定义下限:
int cesar_encrypted(int x)
{
// to wrap around 90
int encrypted = (x - 65 +3) % (90 - 65);
// to start from 65, translate it adding 65
encrypted +=65;
return encrypted;
}
或单行:
int cesar_encrypted(int x){
return (x - 65 + 3) % (90 - 65) + 65; // x in range [65,90]
}
您可以使用模运算符,它给出除法的余数:
int cesar_encrypted(int x)
{
return (x - 65 + 3)%(91 - 65) + 65;
}
执行 Sulthan 的建议(见评论),它看起来像这样:
int cesar_encrypted(int x)
{
const int n_chars = 'Z' - 'A' + 1;
const int shift = 3;
return (x - 'A' + shift)%n_chars + 'A';
}
如果 x+3 > 90
则换行到 65,否则什么也不做:
int cesar_encrypted(int x)
{
return (x+3 > 90 ? ((x+3) % 90 + 64) : x+3);
}
你可以在这里看到它是如何工作的:http://ideone.com/sunxTb
当然你可以 简化这个 以获得没有 if 语句的代码(正如其他人提到的那样):
return (x - 65 + 3)%(91 - 65) + 65;
除此之外,您的代码中还有一些小拼写错误。这是一个类型不匹配:
int z = cesar_encrypted(x);
printf("%s\n", z); // you are trying to print a string instead of int
首先,让我们定义一些常量以提高代码的可读性:
const int MIN_CHAR = 'A'; //equivalent to 65
const int MAX_CHAR = 'Z'; //equivalent to 90
const int NUM_CHARS = MAX_CHAR - MIN_CHAR + 1; //how many chars we have
const int SHIFT = 3; //how many characters we shift when ecrypting
现在
int cesar_encrypted(int x) {
if (x + SHIFT > MAX_CHAR) {
return x + SHIFT - NUM_CHARS; //just subtract the number of chars.
}
return x + SHIFT;
}
也可以使用模块运算符写成
int cesar_encrypted(int x) {
return (x + SHIFT - MIN_CHAR) % NUM_CHARS + MIN_CHAR;
}
我在大学的一个项目中工作,他们使用像典型的 Cesar Cipher 这样的问题。它更像是一个函数式程序,需要是最基本的。
该程序将从 65
到 90
的用户接收一个数字,例如当用户插入 65
时将显示 68
。将添加 3
个数字,但当用户输入 90
时,将输入 67
。 90+3 ---->90,65,66,67
。这是一个从65
到90
的循环。
#include <stdio.h>
int cesar_encrypted(int x)
{
return (x+3);
}
void test_cesar_encrypted(void)
{
int x;
scanf("%d", &x);
int z = cesar_encrypted(x);
printf("%s\n", z);
}
int main(){
test_cesar_basic();
}
我做了这个示例代码,但我们只能更进一步,如果你给90
他会给93
我要67
。
谁能帮我把它换成 90 左右?
使用模运算%
来定义想要的区间的上限和
然后使用加法 +
定义下限:
int cesar_encrypted(int x)
{
// to wrap around 90
int encrypted = (x - 65 +3) % (90 - 65);
// to start from 65, translate it adding 65
encrypted +=65;
return encrypted;
}
或单行:
int cesar_encrypted(int x){
return (x - 65 + 3) % (90 - 65) + 65; // x in range [65,90]
}
您可以使用模运算符,它给出除法的余数:
int cesar_encrypted(int x)
{
return (x - 65 + 3)%(91 - 65) + 65;
}
执行 Sulthan 的建议(见评论),它看起来像这样:
int cesar_encrypted(int x)
{
const int n_chars = 'Z' - 'A' + 1;
const int shift = 3;
return (x - 'A' + shift)%n_chars + 'A';
}
如果 x+3 > 90
则换行到 65,否则什么也不做:
int cesar_encrypted(int x)
{
return (x+3 > 90 ? ((x+3) % 90 + 64) : x+3);
}
你可以在这里看到它是如何工作的:http://ideone.com/sunxTb
当然你可以 简化这个 以获得没有 if 语句的代码(正如其他人提到的那样):
return (x - 65 + 3)%(91 - 65) + 65;
除此之外,您的代码中还有一些小拼写错误。这是一个类型不匹配:
int z = cesar_encrypted(x);
printf("%s\n", z); // you are trying to print a string instead of int
首先,让我们定义一些常量以提高代码的可读性:
const int MIN_CHAR = 'A'; //equivalent to 65
const int MAX_CHAR = 'Z'; //equivalent to 90
const int NUM_CHARS = MAX_CHAR - MIN_CHAR + 1; //how many chars we have
const int SHIFT = 3; //how many characters we shift when ecrypting
现在
int cesar_encrypted(int x) {
if (x + SHIFT > MAX_CHAR) {
return x + SHIFT - NUM_CHARS; //just subtract the number of chars.
}
return x + SHIFT;
}
也可以使用模块运算符写成
int cesar_encrypted(int x) {
return (x + SHIFT - MIN_CHAR) % NUM_CHARS + MIN_CHAR;
}