《算法零基础》第12讲:因子和【题解】

前言

原文出自:算法零基础100讲

LeetCode 1390.四因数

原题链接:1390.四因数

在这里插入图片描述

分析

根据题目要求得出,如果一个数满足有四个因数,那除去 1和数字本身,就剩下两个素数的乘积。所以有以下两种情况:

1.两个素数的乘积,即 num = p*q;
2.某个素数的三次幂, 即 num = p×p×p;

方法

  1. 首先要筛选出题目范围内所有的素数,文章采用的筛选方法为埃氏筛。
  2. 遍历数组,对每个数字num, 在[2, sqrt(num)]范围内的素数进行试除
  3. 如果数字num能够分解为两个素数,或一个素数的三次幂,则使用因子和公式,求出因子和。

因子和公式

出处:英雄哪里出来
专栏:《算法零基础100讲》

如果该数据num可由两个素数相乘得到,即 num = p*q,则因子和公式为:
在这里插入图片描述

如果该数据num是由一个素数的三次幂得到,即num = p×p×p,则因子和公式为:
在这里插入图片描述

代码

#define maxn 100001
#define ll long long

//全局数组默认初始化为0
bool f[maxn];
int primes[maxn];

void ethPrime() //对范围内素数进行筛选
{
	int i;
	ll j;
	f[0] = f[1] = 1;
	primes[0] = 0;
	for (i = 2; i < maxn; ++i)
    {
		if (!f[i])
        {
			primes[++primes[0]] = i;
			for (j = (ll)i * i; j < maxn; j += i)
            {
				f[j] = 1;
			}
		}
	}
}

bool isPrime(int x)
{
	return !f[x];
}

int sumFourDivisors(int* nums, int numsSize)
{
	int i, j, p, q;
	int ans = 0;
	ethPrime();                                  
	for (i = 0; i < numsSize; ++i) //遍历传进来的数组
    { 
    	//遍历素数,primes[0]中存放的素数个数            
		for (j = 1; j <= primes[0]; ++j) 
        {       
			p = primes[j];
			if (nums[i] % p == 0)
            {
				q = nums[i] / p;
				if (isPrime(q) && p != q)
               	{
					ans += (p + 1) * (q + 1);        
				}
				if (q == (long long)p * p)
                {
					ans += p * p * p + p * p + p + 1;
				}
				break;
			}
		}
	}
	return ans;
}

个人感觉大哥用的方法,是非常聪明,还能帮助我们巩固一下基础知识,非常赞👍。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_索伦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值