ZOJ1006 Do the Untwist

本文介绍了一种基于Zoj1006题目的密码解密算法实现,该算法通过特定的数学运算完成密文到明文的转换。文章提供了完整的C++代码示例,包括将字符转换为代码、解密过程及还原为原文的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*===================
From      : Zoj1006
Author    : zscas08220
Algorithm :
ciphercode[i] = (plaincode[ki mod n] - i) % 28 --->
plaincode[ki % n] = (ciphercode[i]+i) % 28。
===================*/
#include<iostream>
#include<algorithm>
#include<string>
#include<cmath>
using namespace std ;

char CC [] = "_abcdefghijklmnopqrstuvwxyz." ;
char Msg [ 72 ];
int k , n, PT [ 72 ];

void ToPlainCode ()
{
    for (int i = 0 ;i < n;i ++ )
    {
        switch (Msg [ i ])
        {
        case '_' :
            PT [ i ] = 0 ;break ;
        case '.' :
            PT [ i ] = 27 ;break ;
        default :
            PT [ i ] = Msg [ i ] - 'a' + 1 ;
        }
    }
}

void Decrypt ()
{
    int i ;
    int tmp [ 72 ];
    for (i = 0 ;i < n;i ++ ) tmp [ i ] = PT [ i ];
    for (i = 0 ;i < n;i ++ )
    {
        PT [( k * i )% n] = (tmp [ i ] + i )% 28 ;
    }
}

void ToText ()
{
    for (int i = 0 ;i < n;i ++ )
    {
        Msg [ i ] = CC [ PT [ i ]];
    }
}

int main ()
{
    while (cin >> k && k )
    {
        cin >> Msg ;
        n= strlen (Msg );
        ToPlainCode ();
        Decrypt ();
        ToText ();
        cout << Msg << endl ;
    }
    return 0 ;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值