0

对于课堂,我必须在 C++ 中开发一个 Caesar 加密项目,该项目接受一个字符串,并将所有 ascii 代码移动一个随机整数。我的项目运行良好,代码如下:

#include <iostream>
#include <string>
#include <stdlib.h>
#include <time.h>

using namespace std;
int main(int argc, const char * argv[]) {

    string sentence = "";
    int shifter, counter = 0, position = 0;
    srand(time(NULL));
    shifter = (rand() % 25) + 1;
    cout << "Enter a sentence, and this program will encrypt it: " << endl;
    getline(cin, sentence);
    cout << "\n\n\n";
    for (int i = 0; i < sentence.length(); i++) {
        sentence[i] = sentence[i] + shifter;
        cout << sentence[i];
    }

    return 0;
}

我唯一的问题是我的老师希望他们只改成字母。如果字母是“z”并且移位是“2”,她希望输出是“b”。我不确定如何做到这一点。

这个问题的简单程序是否可行?如果是这样,它会怎么做?

4

2 回答 2

1

第一步是意识到字母需要映射到数字,以某种方式旋转,然后映射回字母。

@vsoftco 已经尝试通过他的评论让你走上正轨,所以请仔细阅读它们,因为他给了你非常好的提示。

我将尝试填写@vsoftco 遗漏的一些空白。

以下是将字母映射到数字的方法:

char letter = 'B';
int number = letter - 'A';

字母只是计算机知道以字母表示的数字。事实上,字母 'B' 在ASCII中是 66 。因此,如果我们在 C 中这样做:

char letter = 'B';
int number = 100 - 'B'; // <- this is equal to 100 - 66 which is 34

number变成 34。

所以这很好,但我们希望我们的数字在 0 到 25 之间的范围内(这样很容易应用模运算)。

想想看。如果将 5 加到 0 到 25 之间的未知数上,如何确保结果小于 26?使用模数,它将为您包装操作。

但回到将字母转换为数字。要将任何大写字母(注意小写字母有不同的数字)转换为 0 到 25 之间的数字,您可以像这样减去“A”:

char letter = 'C';
int number = letter - 'A'; // <- this is 'C' - 'A' = 67 - 65 = 2 ( which is the 3rd number if we start counting from zero )

要将数字转换回字母,只需添加“A”。

int number = 5; // This is the 6th letter since we start counting from zero
char letter = 'A' + number; // Now letter is 'A' + 5 = 65 + 5 = 70 which is 'F'...

通过这种转换和评论中描述的模运算@vsoftco,您应该能够自己制作凯撒算法。

于 2015-05-11T22:12:44.463 回答
0

愿这能解决你的问题:) http://ideone.com/6AzY2i

#include <bits/stdc++.h>
#define ll long long int
#define MOD 1000000007

using namespace std;
char st[10000000], s[1000000];

int main(){
    cout << "Enter your Ceaser Chipher to decrypt:\n";
    cin >> s;
    ll t;
    t = strlen(s);
    ll n;
    strcpy(st,s);
    /*cout << "Shift of how many characters:\n";
    cin >> n;*/
    cout << "Shift in which direction (r(right) or l(left)) :\n";
    char c;
    cin >> c;
    srand(time(NULL));
    n = (rand() % 25) + 1;
    cout << "Your String is shifted by:" << n <<endl;
    ll f;
    if(c=='r'){
        for(int i=0;i<strlen(st);i++){
            f = st[i] + n;
            if(f>122)
                f = f - 26;
            st[i] = f;
        }
    }
    else if(c=='l'){
        for(int i=0;i<strlen(st);i++){
            f = st[i] - n;
            if(f<97)
                f = f + 26;
            st[i] = f;
        }
    }
    cout <<"Your encrypted String :-> "<< st <<endl;
    return 0;
}
于 2015-05-28T16:58:47.407 回答