2

私は大学のプログラムに取り組んでおり、典型的な Cesar Cipher のような問題を使用しています。それはより機能的なプログラムに似ており、可能な限り最も基本的なものである必要があります。

プログラムは、ユーザーから から までの番号を受け取ります6590たとえば、ユーザーが を挿入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ませ9367

誰かがそれを90前後にラップするのを手伝ってくれますか?

4

4 に答える 4

4

モジュロ演算子を使用できます。除算の余りが得られます。

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';
}
于 2015-09-23T10:15:07.863 に答える
1

まず、コードを読みやすくするためにいくつかの定数を定義しましょう。

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;
}
于 2015-09-23T10:38:49.803 に答える
1

モジュロ演算%を使用して必要な間隔の上限を定義し、加算+を使用して下限を定義します。

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]
}
于 2015-09-23T10:09:38.123 に答える
0

の場合は 65 にラップするだけx+3 > 90で、そうでない場合は何もしません:

int cesar_encrypted(int x)
{
    return (x+3 > 90 ? ((x+3) % 90 + 64) : x+3);
}

ここでその仕組みを確認できます: http://ideone.com/sunxTb
もちろん、これを単純化して、if ステートメントなしでコードを作成できます (他の ppl が述べたように):

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
于 2015-09-23T10:15:11.813 に答える