柏林密码破译如何写更简洁
题目大概如下:密码加密方法是这样的:
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; }
有简洁的算法吗?