GESP5级T1真题 [202309] 因数分解——O(sqrt(n))的时间复杂度,值得一看

描述

每个正整数都可以分解成素数的乘积,例如:6=2*3、20=22 *5

现在,给定一个正整数N,请按要求输出它的因数分解式。

输入描述

输入第一行,包含一个正整数N。约定2<=N<=10^12

输出描述

输出一行,为N的因数分解式。要求按质因数由小到大排列,乘号用星号*表示,且左右各空一格。当且仅当一个素数出现多次时,将它们合并为指数形式,用上箭头^表示,且左右不空格。

用例输入 1

复制代码
6

用例输出 1

复制代码
2 * 3

用例输入 2

复制代码
20

用例输出 2

复制代码
2^2 * 5

用例输入 3

复制代码
23

用例输出 3

复制代码
23

来源

GESP 五级

这道题就算用O(n)的方法也过不了,所以要用O(sqrt(n)),这道题的关键就是在这里。

众所周知,i*i<=n就是sqrt(n)的时间复杂度,那我们就要在其基础上写代码

ACcode

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

long long n;
bool flag=false,f2;
int main() {
	cin>>n;
	for (int i=2;i*i<=n;i++){
		if (n%i==0){
			f2=1;
			int cnt=0;
			while (n%i==0) n/=i, cnt++;//O(sqrt(n))+O(log2n)=O(sqrt(n))
			if (flag==false){
				flag=true;
			}else cout<<" * ";
			if (cnt>1){
				cout<<i<<"^"<<cnt;
			}else cout<<i;
		}
	}
	if(f2==0){
		cout<<n;
	}else if(n!=1)cout<<" * "<<n;
	return 0;
}

感谢王大佬提供思路

看了这么久,作者也写了这么久,能不能点一个赞,在收藏一下呢?最好的话在点个关注吧

谢谢啦!

相关推荐
zjxtxdy1 小时前
C++面向对象程序开发-类与对象
开发语言·c++
東隅已逝,桑榆非晚2 小时前
算法6. 双指针法-查找总价格为目标的两个商品
c++·学习·算法
Eyfcom3 小时前
〖物联网终端实战 01〗UWB 室内高精度定位:仓储 AGV 与人员的厘米级轨迹追踪
物联网·算法·物流系统·快递系统·跨境物流快递系统·物联网终端实战
qq_406981033 小时前
c++拷贝构造函数
开发语言·c++
bro_Java6663 小时前
《排序的底层逻辑:比较、交换与分治》
java·算法·排序算法
爱喝雪碧的可乐4 小时前
MATLAB
开发语言·算法·matlab
叼烟扛炮4 小时前
Linux 学习笔记(六十):单线程的逆袭——epoll 高并发服务器实战
linux·服务器·网络·笔记·学习·算法
careathers5 小时前
【数据结构】基于比较的排序算法 - 交换排序
数据结构·算法·排序算法
H.莓飛5 小时前
【C++】【STL】vector_OJ题
linux·服务器·开发语言·数据结构·c++·visual studio
Rabitebla6 小时前
【Linux操作系统】进程篇(十一):进程程序替换——从底层原理到 exec 函数族
linux·服务器·c++·笔记·学习·算法