867. 分解质因数(最强时间复杂度,O(sqrt(N)))

本文介绍了一种质因数分解的优化算法,该算法利用了n中最多只含有一个大于sqrt(n)的因子这一性质。通过对小于等于sqrt(n)的因子进行遍历,并在最后判断是否还存在大于sqrt(n)的唯一质因子,从而实现高效的质因数分解。

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


 这里有个性质:n中最多只含有一个大于sqrt(n)的因子。证明通过反证法:如果有两个大于sqrt(n)的因子,那么相乘会大于n,矛盾。证毕
于是我们发现最多只有一个大于sqrt(n)的因子,对其进行优化。先考虑比sqrt(n)小的,代码和质数的判定类似
最后如果n还是>1,说明这就是大于sqrt(n)的唯一质因子,输出即可。

时间复杂度:O(sqrt(N)))!

代码:

#include <bits/stdc++.h>
using namespace std;
int n,t,s;
void f(int x)
{
  for(int i = 2;i <= x / i;i++)
    if(x % i == 0)
    {
      s = 0;
      while(x % i == 0)
      {
        x /= i;
        s++;
      }
      cout<<i<<" "<<s<<endl;
    }
    if(x > 1) cout<<x<<" 1"<<endl;
    puts("");
}
int main()
{
  cin>>n;
  while(n--)
  {
    cin>>t;
    f(t);
  }
  return 0;
}

如果这篇文章对您有帮助的话,请记得点赞收藏加关注吖(●'◡'●)

### 分解质因数算法时间复杂度分析 分解质因数是一种常见的算法,用于将一个正整数表示为其质因数的幂次形式。其时间复杂度取决于具体实现方法以及输入数据的特点。 #### 基本原理 对于给定的一个正整数 \( n \),可以通过试除法来寻找它的所有质因数及其对应的指数。试除法的核心思想是从最小的质数 2 开始尝试去除 \( n \),直到无法再被整除为止,接着继续测试下一个可能的因子。这种方法能够有效减少不必要的运算次数[^1]。 #### 时间复杂度讨论 1. **最佳情况下的时间复杂度** 当 \( n \) 是形如 \( 2^k \) 的特殊数值时,由于每次都可以成功地用当前试探值完全划分掉原数的一部分,因此仅需执行大约 \( k = log_2(n) \) 步操作就可以完成整个过程。此时的时间复杂度接近于 \( O(log\ n) \)[^1]。 2. **平均情况下** 平均而言,在处理一般性的自然数时,该算法的实际运行效率介于上述两种极端情形之间。通常来说,随着待测合数规模增大,实际所需迭代步数也会相应增加,但不会达到最差状况的程度[^4]。 3. **最坏情况下的时间复杂度** 如果目标数字本身即为一极大素数,则必须穷尽至多可达 \( √n \) 范围内的每一个候选者才能确认无其他更小因子存在;故此场景下整体耗时大致相当于遍历区间长度,也就是约等于 \( O(√n) \)[^5]。 综上所述,尽管理论上限表明可能存在较高开销的情况发生,但在多数应用场景里,得益于提前终止机制等因素的影响,实际表现往往优于预期极限水平。 ```cpp // C++ 实现示例代码如下: #include <iostream> using namespace std; void factorize(int num){ for(int i=2;i*i<=num;i++){ if(num%i==0){ int count=0; while(num%i==0){ num/=i; ++count; } cout<<i<<" "<<count<<"\n"; } } if(num>1)// 处理剩余的大于 sqrt(original number) 的单一质因子 cout<<num<<" 1\n"; } int main(){ int test_cases,number; cin>>test_cases; while(test_cases--){ cin>>number; factorize(number); cout<<"\n"; } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值