| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2386 人关注过本帖
标题:柏林密码破译如何写更简洁
只看楼主 加入收藏
rainnese
Rank: 1
来 自:广州
等 级:新手上路
帖 子:51
专家分:0
注 册:2016-1-15
结帖率:56.25%
收藏
已结贴  问题点数:8 回复次数:6 
柏林密码破译如何写更简洁
题目大概如下:
密码加密方法是这样的:
1.获得一段文字后,求出它的长度(包括空格)len。
2.进入加密运算的第1步:把所有下标是1倍数的字符做顺时针旋转。
3.进入加密运算的第2步:把所有下标是2倍数的字符做逆时针旋转。
4.进入加密运算的第3步:把所有下标是3倍数的字符做顺时针旋转。
5.按上面的规则,第奇数步按顺时针旋转,偶数步按逆时针旋转,一直到第len步为止。

比如原文是:abcde
1.获得长度len = 5
2.1的倍数有1、2、3、4、5,所以把这5个字符按顺时针旋转,得到eabcd。
3.2的倍数有2、4,所以把这2个字符按逆时针旋转,得到ecbad。
4.3的倍数有3,所以把这1个字符按顺时针旋转,得到ecbad。
5.4的倍数有4,所以把这1个字符按逆时针旋转,得到ecbad。
6.5的倍数有5,所以把这1个字符按顺时针旋转,得到ecbad。
最后的结果是ecbad。
我写的程序是:
程序代码:
#include<stdio.h>
#include<string.h>
char p[1001];
void jishu(char p[1001], int n)
{
    char t = 0;
    int j;
    for ( j = strlen(p)-1;j >= 0;j--)
    {
        if ((j+1)%n == 0) 
        {
            t = p[j];break;
        }
    }
    for (int i = j;i >=2*n-1;i -= n)
    {
        p[i]=p[i-n];
    }
    p[n - 1] = t;
}
void oushu(char p[1001], int n)
{
    int i;
    char t = p[n - 1];
    for ( i = n - 1;i < strlen(p);i += n)
    {
            p[i] = p[i + n];
    }
    p[i - n] = t;
}
int main()
{
    int n;
    while (gets_s(p))
    {
        int len = strlen(p);
        for (int i = len;i >= 1;i--)
        {
            if (i % 2 == 0)jishu(p, i);
            else oushu(p, i);
        }
        puts(p);
    }
    return 0;
}

有简洁的算法吗?
搜索更多相关主题的帖子: 顺时针 密码 如何 加密 
2016-01-31 16:03
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:4 
程序代码:
#include<stdio.h>
#include<string.h>

void trans(char * s, int n, int start)
{
    char t;
    int d, i, j;

    t = s[start];
    d = start & 1 ? start + 1 : -start - 1;
    if((j = start + d) < 0) j = n - n % (start + 1) - 1;
    for(i = start; j != start && j < n; s[i] = s[j], i = j, j += d);
    s[i] = t;
}

int main()
{
    char s[1024];
    int n, i;

    for(; gets(s); puts(s))
    for(n = strlen(s), i = 0; i < n / 2; trans(s, n, i++));

    return 0;
}

重剑无锋,大巧不工
2016-01-31 17:30
rainnese
Rank: 1
来 自:广州
等 级:新手上路
帖 子:51
专家分:0
注 册:2016-1-15
收藏
得分:0 
回复 2楼 beyondyf
结果好像不对,ecbad应该转换为abcde

计算机专业的大学生
2016-01-31 17:56
rainnese
Rank: 1
来 自:广州
等 级:新手上路
帖 子:51
专家分:0
注 册:2016-1-15
收藏
得分:0 
回复 3楼 rainnese
结果反了,不过题目本身有点问题,那个,你能稍稍解释下吗,有点看不懂

计算机专业的大学生
2016-01-31 18:01
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
哦,我写成加密的过程了,倒过来就行了。就是按题意操作移动,只不过通过方向变量d把顺移与逆移合在了一起。
程序代码:
#include<stdio.h>
#include<string.h>

void trans(char * s, int n, int start)

 {
     char t;
     int d, i, j;

     t = s[start];
     d = start & 1 ? -start - 1 : start + 1;
     if((j = start + d) < 0) j = n - n % (start + 1) - 1;
     for(i = start; j != start && j < n; s[i] = s[j], i = j, j += d);
     s[i] = t;

 }

int main()

 {
     char s[1024];
     int n, i;

     for(; gets(s); puts(s))
     for(n = strlen(s), i = n / 2; i >= 0; trans(s, n, i--));

     return 0;

 }

重剑无锋,大巧不工
2016-01-31 18:07
rainnese
Rank: 1
来 自:广州
等 级:新手上路
帖 子:51
专家分:0
注 册:2016-1-15
收藏
得分:0 
回复 5楼 beyondyf
我已经改过来了,就是看不太懂你的思路,能说下吗

计算机专业的大学生
2016-01-31 18:11
拉链
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:107
专家分:534
注 册:2016-1-22
收藏
得分:4 
来个加解密一起来的代码
程序代码:
#include <stdio.h>
void move(char *p,int h,int e,int s)
{
    char a;
    if(s<0)
    {
        h^=e;
        e^=h;
        h^=e;
    }
    a=p[h];
    for(;h!=e;h+=s)p[h]=p[h+s];
    p[e]=a;
}
void encrypt(char *p)
{//加密
    int i,l,s,e;
    for(l=0;p[l];l++);
    for(i=0;p[i];i++)
    {
        s=i+1;
        e=s*(l/s)-1;
        if(s%2)s*=-1;
        move(p,i,e,s);
    }
}
void decrypt(char *p)
{//解密
    int i,l,s,e;
    for(l=0;p[l];l++);
    for(i=l-1;i>=0;i--)
    {
        s=i+1;
        e=s*(l/s)-1;
        if(!(s%2))s*=-1;
        move(p,i,e,s);
    }
}
void main()
{
    char a[1001];
    while(gets(a))
    {
        encrypt(a);
        printf("密码:%s\n",a);
        decrypt(a);
        printf("解密:%s\n",a);
    }
}
2016-01-31 19:11
快速回复:柏林密码破译如何写更简洁
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019666 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved