质数因子(输入一个正整数,按照从小到大的顺序输出它的所有质因子(如180的质因子为2 2 3 3 5 ),最后一个数后面也要有空格。)

题目描述

功能:输入一个正整数,按照从小到大的顺序输出它的所有质因子(如180的质因子为2 2 3 3 5 ),最后一个数后面也要有空格。

输入

多组输入,每组输入一个整数n(1<n<=1e18)。

输出

每组数据输出一行。
每行按照从小到大的顺序输出它的所有质数的因子,以空格隔开。最后一个数后面也要有空格。

样例输入 
180
样例输出 
2 2 3 3 5

一开始看到这个题我直接选择了直接暴力相除,看到数据范围其实有预感要超时,果然超时了,还是得要再想一想

#include<bits/stdc++.h>
using namespace std;
int main(){
    long long int n,c=2;
    while(cin>>n){
    	c=2;
    	while(n!=1){
    		while(n%c==0){
    			cout<<c<<' ';
    			n/=c;
			}
			c++;
		}
		cout<<endl;
	}
	
    return 0;
} 

 然后思考为什么会超时?例如当n的因数是他本身时,会发现要将前面所有数字遍历一遍,增加一个开根号的判断,毕竟在小于n,大于根号n的这一段是一定不存在他的因子的。

下面是通过了的代码段。

#include<bits/stdc++.h>
using namespace std;

int f(int n){
	for(int i=2;i<=sqrt(n);i++){
		if(n%i==0){
			return 0;
		}
	}
	return 1;
}
int main(){
    long long int n,c;
    while(cin>>n){
    	for(int i=2;i<=sqrt(n);i++){
    		while(f(i)&&n%i==0){//判断i是否是质数以及i是否是n的因子 
    			cout<<i<<' ';//输出因子 
    			n/=i;
			}
			if(n==1){//若没有因子了提前跳出 
				break;
			}
		}
		if(n!=1){//若2到根号n的这一段数据都没有n的因子,说明他的因子只有一个,那就是它本身 
			cout<<n;//输出本身 
		}
		cout<<endl;
	}
	
    return 0;
} 

 后来我在整理代码的时候发现如果先存储sqrt(n)的值,还是会出现时间超限,所以在计算的时候不需要提前存储sqrt(n)的值,原因是n的值在动态变化,不断缩小范围,能够减少时间复杂度

for(int i=2;i<=sqrt(n);i++)
c=sqrt(n);
for(int i=2;i<=c;i++)

 若有不恰当的地方,欢迎指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值