2010-09-19 5 views
2

Я должен взломать шифр Цезаря. я должен объявить функцию crack : int * int -> int так, что если (k, c) имеют тип int, где k является расшифрованный текст и c зашифрованный текст, вызывая crack(k, c) возвращает ключ (по модулю 10) n, который необходим для получения c к k , Примером может быть, что вызов crack(20458790, 64892134) вернется 4.Устранить шифр цезаря, используя SML

Если c не правильно кодирования k, функция не должна реально работать.

Надеюсь, я здесь достаточно ясен. Я понимаю фактическое назначение здесь (у меня есть k и c, мне нужно n), но я не знаю, как показать это в моем коде.

ответ

1

Вы не указали, что должно произойти, когда второе число не является цезарной кодировкой первого, поэтому я собираюсь предположить, что это не имеет значения.

Итак, чтобы получить, вам просто нужно взять любую цифру (наиболее удобно последнюю) из первого числа и вычесть из цифры в том же положении второго номера.

Другими словами, вы можете просто сделать: (c mod 10 - k mod 10) mod 10

+0

Я забыл добавить, что, извините. Если второе число (c) не является надлежащим кодированием первого, функция фактически не должна работать. Я попробовал то, что вы предложили, но по какой-то причине он возвращает 6 вместо 4, когда я вводил числа сверху. Любая идея, почему он это сделает? Благодаря! – GeorgeWChubby

+0

Большое вам спасибо! Я думаю, что, наконец, понял. Я просто должен был сказать (c mod 10 - k mod 10) mod 10 вместо этого. Я не уверен, почему, но это работает. – GeorgeWChubby

+0

@George: Ой, да, я переключил имена переменных. Он работает, потому что он просто вычитает последнюю цифру k от последней цифры c. Поэтому, если вы добавите эту разницу в последнюю цифру c, вы получите последнюю цифру k. И то же самое касается любой другой цифры, потому что все цифры имеют одинаковую разницу. – sepp2k