华为初级——字符串加密

描述:有一种技巧可以对数据进行加密,它使用一个单词作为它的密匙。下面是它的工作原理:首先,选择一个单词作为密匙,如TRAILBLAZERS。如果单词中包含有重复的字母,只保留第1个,其余几个丢弃。现在,修改过的那个单词死于字母表的下面,如下所示:
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
T R A I L B Z E S C D F G H J K M N O P Q U V W X Y
上面其他用字母表中剩余的字母填充完整。在对信息进行加密时,信息中的每个字母被固定于顶上那行,并用下面那行的对应字母一一取代原文的字母(字母字符的大小写状态应该保留)。因此,使用这个密匙,Attack AT DAWN(黎明时攻击)就会被加密为Tpptad TP ITVH。请实现下述接口,通过指定的密匙和明文得到密文。详细描述:接口说明:
原型:voidencrypt(char * key,char * data,char * encrypt);
输入参数:
    char * key:密匙
    char * data:明文
输出参数:
    char * encrypt:密文
返回值:void   
知识点:  字符串  
题目来源:  内部整理  
练习阶段:  初级  
运行时间限制: 10Sec 
内存限制: 128MByte 
输入:先输入key和要加密的字符串  
输出:返回加密后的字符串  
样例输入: 
nihao
ni                    
样例输出: le
源程序:
#include<iostream>
#include<cstring>
using namespace std;
#define M 100
int main()
{
	char key[M],data[M],encrypt[M];
	void Encrypt(char *key,char *data,char *encrypt);
	gets(key);
	gets(data);
	Encrypt(key,data,encrypt);
	cout<<encrypt<<endl;
	return 0;
}
void Encrypt(char *key,char *data,char *encrypt)
{
	char keych[M];
	keych[0]=key[0];
	int i,j=0,k=0,flag;
	for(i=0;key[i]!='\0';i++)//把已去掉密钥中重复字符的密钥赋给keych[],
	{
		flag=1;
		for(k=0;k<j+1;k++)
		{
			if(key[i]==keych[k])
				flag=0;
		}
		if(flag)
		{
			j=j+1;
			keych[j]=key[i];
		}
	}
	int len;
	len=j+1;//keych的长度
	char Alph[27]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	for(i=0;Alph[i]!='\0';i++)//keych[]补全,长度为26
	{
		flag=1;
		for(k=0;k<len;k++)
		{
			if(Alph[i]==keych[k])
				flag=0;
			if(Alph[i]==keych[k]-32)
			{
				keych[k]=keych[k]-32;flag=0;
			}
		}
		if(flag)
		{
			keych[len]=Alph[i];
			len=len+1;
		}
	}
	keych[len]='\0';
	i=0;k=0;
	while(data[i]!='\0')//明文转换为密文
	{
		if((data[i]>='A'&&data[i]<='Z')||(data[i]>='a'&&data[i]<='z'))
		{
			for(j=0;j<26;j++)
			{
				if((data[i]==Alph[j])||(data[i]-32==Alph[j]))
				{
					if(data[i]>='A'&&data[i]<='Z')
						encrypt[k]=keych[j];
					else
						encrypt[k]=keych[j]+32;
					break;
				}
			}
		}
		else
			encrypt[k]=data[i];
		i=i+1;k=k+1;
	}
	encrypt[k]='\0';
}
鄙视我自己,只会用for和while循环,真是木有办法。
运行结果:

每一次都只能用很笨的办法,才能解决这些问题。知识面太窄了吗?

华为初级——字符串加密

时间: 2024-10-13 07:46:06

华为初级——字符串加密的相关文章

华为OJ——字符串加密

题目描述 有一种技巧可以对数据进行加密,它使用一个单词作为它的密匙.下面是它的工作原理:首先,选择一个单词作为密匙,如TRAILBLAZERS.如果单词中包含有重复的字母,只保留第1个,其余几个丢弃.现在,修改过的那个单词死于字母表的下面,如下所示: 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 T R A I L B Z E S C D F G H J K M N O P Q U V W X Y 上面其他用字母表中剩余的字母填充完整.在

华为训练题目:初级——字符串最后一个单词的长度

初级 字符串最后一个单词的长度 描述 计算字符串最后一个单词的长度,单词以空格隔开. 知识点 字符串,循环 运行时间限制 0M 内存限制 0 输入 一行字符串,长度小于128. 输出 整数N,最后一个单词的长度. 样例输入 hello world 样例输出 5 思路:这道题字符串可能中间有空格,可能后面最后有空格. 先将下标从后往前指到最后一个不是空字符的方,再开始计数 1 #include<iostream> 2 #include<string> 3 using namespac

华为测试 字符串运用-密码截取

Catcher是MCA国的情报员,他工作时发现敌国会用一些对称的密码进行通信,比如像这些ABBA,ABA,A,123321,但是他们有时会在开始或结束时加入一些无关的字符以防止别国破解.比如进行下列变化 ABBA->12ABBA,ABA->ABAKK,123321->51233214 .因为截获的串太长了,而且存在多种可能的情况(abaaab可看作是aba,或baaab的加密形式),Cathcer的工作量实在是太大了,他只能向电脑高手求助,你能帮Catcher找出最长的有效密码串吗? 输

华为初级——(练习用)挑7

源程序: #include<iostream> #include<string> using namespace std; int main() { int n;char buffer[6]; int count=0; int len; cin>>n; for(int i=1;i<=n;i++) { if((i%7)==0)count++; else { itoa(i,buffer,10); len=strlen(buffer); for(int j=0;j<

华为初级——字符个数统计(三种情况)

第一种情况: 描述:写出一个程序,接受一个有字母和数字组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数.不区分大小写. 知识点:字符串,函数,指针   题目来源:内部整理   练习阶段:初级   运行时间限制:10Sec  内存限制:128MByte  输入:输入一个有字母和数字组成的字符串,和一个字符.   输出:输出输入字符串中含有该字符的个数.  样例输入: ABCDEF A                    样例输出: 1 源程序: #include<iostream>

华为初级——提取不重复的整数

描述:输入一个int型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数. 知识点:数组 题目来源:内部整理 练习阶段:初级 运行时间限制:10sec 内存限制:128MByte 输入:输入一个int型整数 输出:按照从右向左的阅读顺序,返回一个不含重复数字的新的整数 样例输入:9876673 样例输出:37689 源程序: #include<iostream> using namespace std; int main() { void getNoRepeatNumber(int

字符串加密解密

字符串加密(指定加密密钥) 如字符串"Good good study,day day up! You can you up,no can no bibi!",加密密钥为"marchfour",对字符串进行加密 原理很简单,就是字符之间的异或 错误的代码: 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 void encrypt_decode(char

字符串加密

//字符串加密 //Qi Ming Liu,October 23,2015 package Demo; import javax.swing.JOptionPane; public class StringSercet {  public static void main(String[] args) { String str=JOptionPane.showInputDialog("请输入一个字符串:"); char charArray[]=str.toCharArray();   

课堂-字符串加密

//字符串加密 //Qi Ming Liu,October 23,2015 package Demo; import javax.swing.JOptionPane; public class StringSercet {  public static void main(String[] args) { String str=JOptionPane.showInputDialog("请输入一个字符串:"); char charArray[]=str.toCharArray();