本帖最后由 Minister 于 2021-1-22 11:24 编辑
写这初衷:
1.学以致用。将理论转化为实际,真写起来,会发现:语法不熟悉,盲区,扣字还慢
2.现实需要。通用算法不好吗?好,否则不能通用;自写算法好吗?不好,也好。适合的最好
启发来源:
ASCII转数字 进制转换
以下为代码,直击结果,中间的逻辑判断,没写。
[C] 纯文本查看 复制代码 # include <stdio.h>
# include <string.h>
# include <stdlib.h>
int main (void)
{
char a[6][7] = {{"012~34"},{"abced#"},{"FGHIJ-"},{"klmnop"},{"qrstu."},{"VWXYZ+"}};
char b[6][7] = {{"ABCDE@"},{"fghij&"},{"KLMNOP"},{"QRSTU/"},{"vwxyz*"},{"667?89"}};
int p[4]={279936,1679616,10077696,362797056};//判断密文位数 此数据得得出是 6的8、9、10、11次方
int h=6,m=0,n,s=0,c,max,min,type,tmp,len;
char str[8];
printf("待加密[限制8位]:");
scanf("%s",str);
len=1;//生成密码为9位
for(int x=0;x<strlen(str);x++){
m+=int(str[x]);
}
if(m<p[len]){ //判断明文转进制后,是否满足密文N位数最小值,折中取值 此步骤为构造
min=p[len]/m;
max=p[len+1]/m;
tmp=(min+max)/2;
m=m*tmp;
}
do{ //在多维数组碰撞,生密文 此步骤为构造
n=m%h;
m=m/h;
c=m%6;
printf("%c",(s%2==0)?a[c][n]:b[c][n]);
s++;
}while(m!=0);
return 0;
}
今天抛个砖,既希望没砸到人,也希望引出更多爱好者的"创造性"之玉:
1.帮我完善下逻辑,群力之所举则无不胜
2.思考:是否可逆
3.思考:密文是否具有唯一性
一起加油鸭!
{:1_892:} :handshake |