质因数分解的坑点

题目重述
已知正整数 n n n是两个不同的质数的乘积,试求出两者中较大的那个质数。
其中 n ≤ 2 × 1 0 9 n≤2×10^9 n2×109
当然我的思路就真的非常直接了,循环两个乘数,满足乘积正确,并且判断两数为质数,代码如下:

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

bool isPrime(int x)//判断是否为质数(布尔变量)
{
	bool k=true;
	long long m;//小心别和i重名了
	for(m=2;m<=sqrt(x);m++)
	{
		if(x%m==0){
			k=false;
			break;
		}
	}
	return k;
} 

int max(long long i,long long j)//取符合要求的最大值
{
	long long max;
	if(i>j) max=i;
	if(i<j) max=j;
	return max;
}

int main()
{
	long long i,j,x;
	cin>>x;
	for(i=2;i<=sqrt(x);i++)//其中一者到平方根就行了
	{
		for(j=2;j<=x;j++)
		{
			if(i*j==x)
			{
				if(isPrime(i)&&isPrime(j))
				cout>>max(i,j);
			}
		}
	}
	return 0;
} 

当然结果是没有问题的,但是测试结果如下:
在这里插入图片描述
T i m e L i m i t E x c e e d Time Limit Exceed TimeLimitExceed 说明在算法上这个代码很冗杂! 使用了循环嵌套,时间复杂度 O ( n 2 ) O(n^2) O(n2)
于是我想只用一次循环实现这个过程:只循环 i i i变量(从2到 s q r t ( x ) sqrt(x) sqrt(x))并判断是否为x的因数,如果是,再判断是否为质数,满足要求的话, i i i就一定是这两个乘数中最小的那个,于是 x / i x/i x/i也就是我们所求的结果。

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

bool isPrime(int x)
{
	bool k=true;
	long long m;
	for(m=2;m<=sqrt(x);m++)
	{
		if(x%m==0){
			k=false;
			break;
		}
	}
	return k;
} 

int main()
{
	long long i,j,x;
	cin>>x;
	for(i=2;i<=sqrt(x);i++)
	{
		if(x%i==0)
		{
			if(isPrime(i))
			cout<<x/i;
		}
	}
	return 0;
} 

其实再由题目要求,输入的数据已经满足质数相乘,所以可以省去判断质数的函数,本题代码如下:

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

int main()
{
	long long i,j,x;
	cin>>x;
	for(i=2;i<=sqrt(x);i++)
	{
		if(x%i==0)
		{
			if(isPrime(i))
			cout<<x/i;
		}
	}
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Mr.zwX

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

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

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

打赏作者

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

抵扣说明:

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

余额充值