[NOIP2012 普及组] 质因数分解
题目描述
已知正整数n是两个不同的质数的乘积,试求出两者中较大的那个质数。
输入格式
一个正整数n。
输出格式
一个正整数p,即较大的那个质数。
输入输出样例
输入 #1复制
21
输出 #1复制
7
说明/提示
n≤2×109
NOIP 2012 普及组 第一题
既然是质数那么就肯定存在一个整数能整除那么就从两边开始两头压着逐一找也就是扫描2~n-1内的数字发现整除数直接输出即可。因为是寻找质数,众所周知除了2以外其他的偶数都不是质数,所以特殊判断一下2其他的偶数可以直接跳过不看
#include <iostream>
using namespace std;
//判断能否整除
//bool IsDivisible(int isDdivisor, int divisor)
//{
// int temp = isDdivisor / divisor;
// if (divisor * temp == isDdivisor)
// return true;
// else
// return false;
//}
int main()
{
int n;
int left = 0;
int right = 0;
bool flagL = false, flagR = false;
cin >> n;
//2特殊判断一下
if (n % 2 == 0)
cout << n / 2 << endl;
else
{
//左边从3开始
left = 3;
//右边如果是这个数字是偶数那么减一从邻近的奇数开始走
//如果这个是奇数那么减2跳过相邻的偶数从奇数开始走
right = right % 2 == 0 ? n - 1 : n - 2;
}
//利用函数的写法
/*while (left < right)
{
if (IsDivisible(n, left))
{
flagL = true;
break;
}
if (IsDivisible(n, right))
break;
left += 2;
right -= 2;
}*/
while (left < right)
{
if (n % left == 0)
{
flagL = true;
break;
}
if (n % right == 0)
{
flagR = true;
break;
}
//每次加2跳过偶数
left += 2;
right -= 2;
}
//这里不需要判断
/*if (flagL)
cout << max(left, n / left) << endl;
else
cout << max(right, n / right) << endl;*/
//左边先整除的话一定是因子的小的那个因为左边是从小的数开始找的
//右边刚好相反
if (flagL)
cout << n / left << endl;
else if (flagR)
cout << right << endl;
return 0;
}