回 帖 发 新 帖 刷新版面

主题:[讨论]zoj上1006题老是WA?帮忙看下代码,先谢啦~~

#include<iostream>
#include<string>

using namespace std;


int main()
{
    int i;
    int n;  
    int k;  
    char plain[70]={0},cipher[70]={0};
    int p[70]={0},c[70]={0};
    cin>>k;
   while(k&&k<=300) //输入密钥和密文
   {
    cin>>cipher;
    n=strlen(cipher);
    for(i=0;i<n;i++)  //将字母转换成要求的数字
    {
        switch(cipher[i])
        {
        case '_': c[i]=0;break;
        case '.': c[i]=27;break;
        default: c[i]=cipher[i]-96;
        }
    }
    for(i=0;i<n;i++)
    {
        int t;
        t=(k*i)%n;
        p[t]=(c[i]+i)%28;
    }
    for(i=0;i<n;i++)
    {
        switch(p[i])
        {
        case 0: plain[i]='_';break;
        case 27: plain[i]='.';break;
        default: plain[i]=p[i]+96;
        }
    }
    cout<<plain<<endl;
    cin>>k;
   }
    return 0;
}

回复列表 (共4个回复)

沙发

看晕了……总觉得乖乖的

板凳

没看懂LZ想问什么,不过我认为LZ的方案有三个方面需要改善:   
    1.  你总得要检验k和n是互质的吧,不然有可能t一直为0等后果会出现;    
    2.  字符数组plain总得用空字符来标记它的结束的位置吧,不然的话执行1次
        while 循环以后可能在密文后面出现上次遗留下的密文;    
    3.  密文还原问题。我觉得一个密文可能对应几个不同的原文,除非使用时规定字
        符集,如只使用"_A~Z."其中A~Z表示所有大写字母。

3 楼

我觉得plain用空字符标记结尾还不够,每次while循环后要全部重置为0.

4 楼

你好.我是全职网赚工作者.
如果你有时间有电脑.
想在网络上创业.请联系我..
项目绝对真实.详情QQ空间资料
加盟请联系 QQ908889846

我来回复

您尚未登录,请登录后再回复。点此登录或注册