每日两题——最难的问题、因子个数

最难的问题

题目描述

在这里插入图片描述
本题为密码破译类型问题。输入为一行密码,由大写字母和空格组成。
要求输出破译后的密码。

思路解析

密码的加密规则:对于密码中的每个字母,分别用该字母之后的第五个字母进行替换,对于特殊的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;
}



上述内容为在做题后对题目的解析与整理。如有不足之处还请指出。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值