求最大素因子

原题记录:

对于给定的字符序列,从左至右将所有的数字字符取出拼接成一个无符号整数(字符序列长度小于100,拼接出的整数小于2^31,),计算并输出该整数的最大素因子(如果是素数,则其最大因子为自身)

  • 首先什么是某个数a的素因子?

当数i能够整除a且i为素数,那么i就是数a的素因子,最大素因子就是取所有a的素因子中的最大值


实现

  • 穷举法

最简单粗暴的办法就是穷举,i从a开始自减1,每次判断是否能够整除a并且是素数,找到的第一个i就是最大的。

缺点:这种办法效率很低,并且数越大,判断素数的循环次数就越多,对于大数,肯定会超时的

  • 初步改进

每一个数都可以分为n个数的乘积形式(n未知)。由此我们可以把数a中的因子逐步剔除。

从i=2开始,先将2的所有倍数从a中剔除,若a=x*2n,则剔除2的倍数后,a=x,然后i=3,4,···,a-1,依次进行。当然,能够剔除的前提是,a能够整除i,即a%i=0。最后a一定是一个没有因子的素数了,且a一定是最大的,因为凡是小于a的因子都被剔除了。这就是我们要找的最大素因子。

  • 进一步改进

但其实上述方法还有改进的空间,随着剔除的进行,a值会越来越小,实际上当i>sqrt(a)时,凡是小于i的数都被剔除了,因此a不会含有因子i,(即a= x*i,x<i不存在)所以i的循环可以在sqrt(a)时终止。此时的a已经是最大的素因子。

题解代码:

#include <iostream>
#include <cstring>
#include <math.h>
using namespace std;

unsigned int getNum(string str){
    unsigned int num=0;
    int len=str.length();
    for(int i=0;i<len;i++)
    {
        if(str[i]>='0' && str[i]<='9')
        {
            unsigned int temp=str[i]-'0';
            num = num*10 + temp;
        }
    }
    return num;
}

unsigned int getMaxPrimeFactor(unsigned int num){
    for(int i=2;i*i<=num;i++)
    {
        while(num%i == 0){
            num=num/i;
        }
    }
    return num;
}
int main()
{
    int n;
    cin>>n;
    string str[n];
    for(int i=0;i<n;i++)
    {
        cin>>str[i];
    }
    unsigned int num=0;
    unsigned int pf=0;
    for(int i=0;i<n;i++)//对每一个字符串处理
    {
        //先取数字
        num = getNum(str[i]);
        if (num == 0)//没有数字或找出的数为0
        {
            cout<<0<<endl;
            continue;//继续下一个字符串的处理
        }
        //再判断最大素因子
        pf = getMaxPrimeFactor(num);
        cout<<pf<<endl;
    }
    return 0;
}

以上为个人做题笔记,仅作参考

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
蚁群算法(Ant Colony Optimization,ACO)是一种模拟蚂蚁觅食行为的启发式优化算法。它利用蚂蚁在寻找食物时释放信息的行为特点,来寻找问题的最优解。 对于解函最大值问题,可以将函看作是某个地方的食物,蚂蚁在搜索时会根据信息浓度的大小选择前往某个方向。而信息的浓度则与函值大小成正比。 下面是一个简单的使用蚁群算法解函最大值的 Python 代码: ```python import random import math # 目标函 def func(x): return math.sin(10 * x) * x + math.cos(2 * x) * x # 蚂蚁类 class Ant: def __init__(self, position): self.position = position self.value = func(position) # 蚁群算法 def ACO(): ant_count = 20 # 蚂蚁量 max_iter = 100 # 最大迭代次 pheromone = 1 # 信息初始浓度 alpha = 0.5 # 信息重要程度因子 beta = 0.5 # 启发式因子 evaporation = 0.5 # 信息挥发系 search_range = [-10, 10] # 搜索范围 # 初始化蚂蚁 ants = [Ant(random.uniform(search_range[0], search_range[1])) for _ in range(ant_count)] # 主循环 for _ in range(max_iter): # 更新信息浓度 for ant in ants: ant.value = func(ant.position) ant.pheromone = pheromone / ant.value # 更新信息浓度 for ant in ants: delta_pheromone = ant.pheromone pheromone = (1 - evaporation) * pheromone + delta_pheromone # 更新蚂蚁位置 for ant in ants: pos = ant.position p = random.random() if p < 0.5: pos += alpha * random.uniform(-1, 1) * (search_range[1] - search_range[0]) else: pos += beta * (pheromone / ant.value) * (search_range[1] - search_range[0]) pos = max(search_range[0], min(search_range[1], pos)) ant.position = pos # 返回最优解 return max(ants, key=lambda ant: ant.value).position # 测试 print(ACO()) ``` 在上面的代码中,目标函为 $f(x) = sin(10x) \cdot x + cos(2x) \cdot x$,搜索范围为 $[-10, 10]$,蚂蚁量为 20,最大迭代次为 100。运行代码后,输出的结果即为函最大值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值