古老的密码(Ancient Cipher, NEERC 2004, UVa 1339) 算法竞赛入门 快排qsort

本文探讨了一种通过统计字母频率并使用快速排序算法来破解密码的方法。通过对两个字符串进行映射,比较其排序后的字母频率,从而判断密码是否相同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    ① Cipher:n密码,暗号,不重要的人(知识点啊!朋友们!)

    ② 映射:我觉得这里的映射,不单纯,很做作!白莲花!我的理解是,这里的映射是一个圈,A->B->C .... ->Z->A,所以无论你输入的是什么字母,它都可以任意映射到其他字母,这样一想的话,这个题目就简单多了。(然而并没有!(。・ˇдˇ・。)

    ③所以:判断条件就是:要记录下每个字母出现的次数,重新排序(升序,降序随便选,这里是用快排来做的排序),两个数组一样,这什么奇怪的古老密码就被破了。

    ④关于上面 那个映射的理解吧,其实有个小猫饼,看完我的代码我再说猫饼在哪儿

        (怎样,我就是心机(๑´ㅂ`๑) )

    ⑤算法竞赛入门书的作者说,在真的比赛里是不用qsort的,我写这个的目的就是

        闲得慌(想不到吧!Σ(゚д゚lll))

#include <stdio.h>
#include <stdlib.h> 
#include <string.h> 
//升序 
int cmp(const void *a, const void *b){
	return (*(int *)a - *(int *)b);
} 
int main()
{
	int i;
	int len1, len2;
	char str1[105], str2[105];
	int a[26], b[26];
	while(gets(str1)!= NULL)
	{
		gets(str2);
		len1 = strlen(str1);
		len2 = strlen(str2);
		if(len1 != len2)
		{
			printf("NO!\n");
		 } 
		 else
		 {
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));
		for(i = 0; i < len1; i++)
		{
			a[int(*(str1 + i) - 'A')]++;
			b[int(*(str2 + i) - 'A')]++;
			
		}
		//快排
		qsort(a,26,sizeof(int),cmp);
		qsort(b,26,sizeof(int),cmp);
		for(i = 0; i < 26; i++)
		{
			if(a[i] != b[i])
				break;        //当然这里可以用flag来做 
		}
		if(i == 26)
			printf("Yes!\n");
		else
			printf("NO!\n");
		 }
	}
	return 0;
} 
    猫饼就是:那古罗马帝国的人,怎么破解它们的密码?既然每个密码是可以转换成任意字母的?所以我理解的这个映射是有点猫饼的!希望知道的正确思路的朋友能告知我一下(谢谢大佬!(o°ω°o))

    

古老密码,也称为古典加密技术,常指一些早期使用的编码方式,如凯撒密码、维吉尔密码(Vigenère cipher)等。在C++编程中,解决这类题目的常见步骤包括: 1. **了解加密算法**:首先要熟悉所涉及的密码学原理,比如凯撒密码是通过将字母表移动固定位数来加密,而维吉尔密码则是通过多次应用简单的替换规则。 2. **设计解密函数**:编写函数来读取加密后的文本,并按照特定的规则将其解码回原始信息。例如,对于凯撒密码,只需遍历字母表并把每个字符向左或右移动固定次数即可。 3. **输入处理**:接收用户输入的加密文本和密钥(如果需要),确保它们在解密过程中正确应用。 4. **测试和优化**:编写测试案例来验证解密函数是否能准确还原出原文,同时可以考虑性能优化,比如预计算字母表的移位。 下面是一个简单的凯撒密码解密示例(假设加密位数已知): ```cpp #include <iostream> #include <cctype> std::string caesarCipherDecipher(const std::string& encryptedText, int shift) { std::string decryptedText = ""; for (char c : encryptedText) { if (isalpha(c)) { // 检查是否为字母 char lowerCaseChar = tolower(c); // 转换为小写字母以便统一处理大小写 decryptedText += static_cast<char>((lowerCaseChar - 'a' - shift + 26) % 26 + 'a'); } else { decryptedText += c; // 非字母字符保持不变 } } return decryptedText; } int main() { std::string inputEncryptedText; int shiftAmount; std::cout << "Enter the encrypted text and shift amount: "; std::getline(std::cin, inputEncryptedText); std::cin >> shiftAmount; std::string decryptedText = caesarCipherDecipher(inputEncryptedText, shiftAmount); std::cout << "Decrypted text: " << decryptedText << std::endl; return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值