求助一道C语言的编程题!
一个文本串可用事先给定的字母映射表进行加密。例如,设字母映射表为:abcdefghijklmnopqrstuvwxyzngzqtcobmuhelkpdawxfyivrsj...
一个文本串可用事先给定的字母映射表进行加密。例如,设字母映射表为:
a b c d e f g h i j k l m n o p q r s t u v w x y z
n g z q t c o b m u h e l k p d a w x f y i v r s j
则字符串"encrypt"被加密为"tkzwsdf".试写一算法将输入的文本串进行加密后输出;另写一算法,将输入的已加密的文本串进行解密后输出
谢谢帮忙呀! 展开
a b c d e f g h i j k l m n o p q r s t u v w x y z
n g z q t c o b m u h e l k p d a w x f y i v r s j
则字符串"encrypt"被加密为"tkzwsdf".试写一算法将输入的文本串进行加密后输出;另写一算法,将输入的已加密的文本串进行解密后输出
谢谢帮忙呀! 展开
5个回答
2008-03-14
展开全部
分析:先将顺序串的存储结构定义修改如下:
typedef struct{
char ch[2][MaxStrSize];
int length;
}SeqString;
不妨设ch的第0行存放原字母表,第1行存放映射表.具体算法如下:
(1)void Encoding(char *S,SeqString T){
//设串S中存放待加密的文本,T中存放字母表及映射表
int i,j;
int m=T.length; //字母表长
int n=strlen(S); //字符串长
for(i=0;i<n;i++){ //扫描文本串
for(j=0;i<m;j++) //扫描字母表
if(S[i]==T.ch[0][j]){
printf("%c",T.ch[1][j]); //加密输出
break; //跳出内循环
}
if(j==m)Error("%c is not in alphabet",s[i]);
}
}
(2)void DeCoding(char *S, SeqString T){ //S为待解密串
int i,j;
int m=T.length; //字母表长
int n=strlen(S); //字符串长
for(i=0;i<n;i++){ //扫描文本串
for(j=0;i<m;j++) //扫描字母表
if(S[i]==T.ch[1][j]){
printf("%c",T.ch[0][j]); //加密输出
break; //跳出内循环
}
if(j==m)Error("%c is not in alphabet",s[i]);
}
}
上述两算法的时间复杂度均为O(m*n).
typedef struct{
char ch[2][MaxStrSize];
int length;
}SeqString;
不妨设ch的第0行存放原字母表,第1行存放映射表.具体算法如下:
(1)void Encoding(char *S,SeqString T){
//设串S中存放待加密的文本,T中存放字母表及映射表
int i,j;
int m=T.length; //字母表长
int n=strlen(S); //字符串长
for(i=0;i<n;i++){ //扫描文本串
for(j=0;i<m;j++) //扫描字母表
if(S[i]==T.ch[0][j]){
printf("%c",T.ch[1][j]); //加密输出
break; //跳出内循环
}
if(j==m)Error("%c is not in alphabet",s[i]);
}
}
(2)void DeCoding(char *S, SeqString T){ //S为待解密串
int i,j;
int m=T.length; //字母表长
int n=strlen(S); //字符串长
for(i=0;i<n;i++){ //扫描文本串
for(j=0;i<m;j++) //扫描字母表
if(S[i]==T.ch[1][j]){
printf("%c",T.ch[0][j]); //加密输出
break; //跳出内循环
}
if(j==m)Error("%c is not in alphabet",s[i]);
}
}
上述两算法的时间复杂度均为O(m*n).
展开全部
不小心看到你的字符映射表是1对1的...
实现如下:
#include <stdio.h>
#include <stdlib.h>
static char en[27] = "ngzqtcobmuhelkpdawxfyivrsj";//加密表,产生解密表时根据最后的0来判断,所以为27,下面为26
static char de[26];//解密表
// 根据已有加密映射表,产生解密映射表
void get_des() {
char *p = en;
do {
de[*p - 'a'] = 'a' + p - en;
} while (*++p != 0);
}
// 打印原字符串和加密后的字符串
void display_en_by_str(char *ptr) {
printf("%32s -> ", ptr);
while (*ptr != 0) {
putchar(en[*ptr++-'a']);
}
printf("\n");
}
int main()
{
char str[256];
get_des();
printf("en: %s\nde: %s\n", en, de);
printf("Input a string(exit to quit): " );
scanf("%s", str);
while (strcmp(str, "exit") != 0) {
display_en_by_str(str);
printf("Input a string(exit to quit): " );
scanf("%s", str);
}
}
实现如下:
#include <stdio.h>
#include <stdlib.h>
static char en[27] = "ngzqtcobmuhelkpdawxfyivrsj";//加密表,产生解密表时根据最后的0来判断,所以为27,下面为26
static char de[26];//解密表
// 根据已有加密映射表,产生解密映射表
void get_des() {
char *p = en;
do {
de[*p - 'a'] = 'a' + p - en;
} while (*++p != 0);
}
// 打印原字符串和加密后的字符串
void display_en_by_str(char *ptr) {
printf("%32s -> ", ptr);
while (*ptr != 0) {
putchar(en[*ptr++-'a']);
}
printf("\n");
}
int main()
{
char str[256];
get_des();
printf("en: %s\nde: %s\n", en, de);
printf("Input a string(exit to quit): " );
scanf("%s", str);
while (strcmp(str, "exit") != 0) {
display_en_by_str(str);
printf("Input a string(exit to quit): " );
scanf("%s", str);
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个加密算法是最古典的加密算法,太旧了,去网络上荡个DES算法可能还行
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
c++ primer有这个问题的解法(p317)
用map做的
用map做的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
没反应过来^
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询