2016-12-11 15 views
2

私は学校の宿題のためにJavaで何らかの暗号をやっています。タスクは、certian charの値を、ユーザーが指定した負の数から正の数(アルファベット)までの範囲の特定のオフセットを持つ新しい値に変更することです。負の文字列インデックス

負のオフセットに問題があります。新しい文字を見つけるのに役立つアルファベットの文字列を作成しました。例:オフセットが7の場合、これはencrypt(“TEST”) = “ALZA”です。したがって、私のコードは文字列値のインデックスを取得し、新しい文字のアルファベット文字列でこのインデックスを検索します。とにかく、私は今'E'の文字と負のインデックス、すなわち'-7'を持っていれば、それは-3の値を新しい文字の新しいインデックスに返します(意味があると思います)。インデックス'-3'に文字がないのでエラーが発生します。

負のインデックス番号にますます行くのではなく、文字列の最後にアクセスするにはどうすればよいですか?

答えて

2

一般的な問題は、文字はわずか26個のインデックスで表されているように見えますが、使用する実際のインデックス変数は26より大きい場合もあれば0より小さい場合もあります。この問題を処理する1つの方法は、mod演算子を使用して、常に有効な文字を含む範囲を指すようにインデックスをラップすることです。ここで

はそれを行うことができロジックです:

if (index < 0) { 
    index = (index % 26) + 26; 
} 
else { 
    index = index % 26; 
} 

Eが位置5で手紙を仮定し、あなたが-7の再割り当てを持っている、これは新しいインデックスは-2になることを意味します。位置24で

5 - 7 = -2 
(-2 % 26) + 26 
-2 + 26 
24 

と文字が文字X:この新しい位置はどこindex = -2この場合は、次のように上記のロジックを使用してマッピングすることができます。

+0

これは、私がそれを手渡した方法ですが、何かが[リンク](http://pastebin.com/imJAh3XR)の12行目で台無しです。あなたは説明した? – ethanqt

+0

@ethanqt完全なコードをデバッグすることなくその質問に答えることはできません。 –

+0

これは私がこれまでに持っているものです:[リンク](http://pastebin.com/n1m1YUsw) – ethanqt

3

は26、その後のmod 26を追加します。

i = (i + 26) % 26; 

これは常に-26までのインデックスのために働きます。それが十分でない場合は、単にいくつかのゼロを追加します。

i = (i + 26000000) % 26; 
+0

'これはいつも動く' ...負のインデックスが-26未満を覆う場合、これは動作しません。 –

+0

@tim答えはあなたのためだけに編集されました:) – Bohemian

0

あなたが陽性とシフト値を制約することができる場合、あなたは剰余演算子を使用することができます。

int型newIndexが=(指数は+シフト)%26

予想されるネガがある場合:

int型newIndexが= Math.floorMod(inndex +シフト、26)

は実際にあなたが数学の必要なトリックを行うだろう私はモジュロですが、%演算子はそれほどではありません

関連する問題