最难的问题
题目描述
本题为密码破译类型问题。输入为一行密码,由大写字母和空格组成。
要求输出破译后的密码。
思路解析
密码的加密规则:对于密码中的每个字母,分别用该字母之后的第五个字母进行替换,对于特殊的26个字母的最后五位,则用ABCDE来分别替换VWXYZ
那么破译规则:对于原文中的每个字母,我们可以用该字母的前第五个字母进行替换,对于特殊的ABCDE,我们使用VWXTZ进行破译。
代码实现
#include <iostream>
using namespace std;
#include<string>
int main() {
string str;
while (getline(cin, str)) {
for (auto e : str) {
char ret = '0';
ret = e;
if (ret >= 'A' && ret <= 'B') {
ret = ret + 21;
}
else if (ret >= 'F' && ret <= 'Z') {
ret -= 5;
}
cout << ret;
}
cout << endl;
}
return 0;
}
因子个数
题目描述
由题,输入一个正整数,求对应的因子个数。
示例为输入:30 输出3 输入:26 输出:2 输入:20 输出:2(多组输入)
思路分析:
从本题来看,正常情况下,因子的定义为
但是通过本题对36的解析,我们发现,在本题中的因子有一个附加条件,就是这个因子需要时质数,那么本题相当于求解质因子。且相同的质因子不需要重复计算。
思路解析
首先,我们先找出所有的因子,从2到n的平方根。
为什么是平方根呢?:
(n的质因子最多有一个大于根号n原因:https://www.zhihu.com/question/410344030
我一开始也不是很懂这是在知乎上找到的:
我们知道,一个数是由这几个质因子相乘得到的,我们要求的是一共有几个质因子。例如题目给出的36=232*3,开始我们遍历到2,我们找到了一个质因数为2,那么我们接下来就可以求18的质因数,36/2 = 18。于是我们令n = 18。那么我们可以接着判断18%2是否为0,如果是的话,我们就可以进一步缩小范围求18/2 = 9的质因数,只要符合循环条件就会一直寻找因数。直到不符合循环条件为止
代码实现
#include <iostream>
using namespace std;
//求因子
int func(int n)
{
int sum = 0;
for (int i = 2; i < pow(n, 0.5); i++)
{
if (n % i == 0)
{
sum++;
while (n % i == 0)
{
n = n / i;
}
}
}
if (n != 1)
{
sum++;
}
return sum;
}
int main()
{
int n = 0;
while (cin >> n)
{
cout << func(n)<<endl;
}
return 0;
}
上述内容为在做题后对题目的解析与整理。如有不足之处还请指出。