给定一个整数 n,执行如下算法:
如果 n=0,则结束算法。
找到 n 的最小质因子 d。
令 n 减去 d 并跳转步骤 1。
请你计算,在算法执行的过程中,一共进行了多少次减法操作。
输入格式
一个整数 n。
输出格式
一个整数,表示减法操作的次数。
数据范围
前三个测试点满足 2≤n≤5。
所有测试点满足 2≤n≤1010。
输入样例1:
5
输出样例1:
1
输入样例2:
4
输出样例2:
2
看题目数据范围,此题是一道O(根号n) 题目
此题考查一个思维性过程
算法步骤:
- 如果 n 是 2 的倍数,结果是 n/2,
- 原因很简单,n 减掉 2 之后,还是 2 的倍数;
- 如果 n 不是 2 的倍数,先算出 n 现在的最小质因子(必为奇数),
- 然后相减后 n 又变成 2 的倍数了,结果就是 1+n/2
注意:
所有变量必须都开long long
当时就因为这个没 AC
而且还 TLE,让我以为是算法的问题……
code:
// n 为偶数: n/2
// n 为奇数: n - p 就能转化成偶数 (n - p)/2 + 1
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
int main()
{
LL n;
cin >> n;
LL re = 0;
if(n % 2)
{
for(int i = 2; i <= n / i; i ++)
if(n % i == 0)
{
n -= i;
re ++;
break;
}
if (n % 2) re ++ , n = 0; // 判断本身是质因子
}
re += n / 2;
cout << re << endl;
return 0;
}