题目链接:Odd Divisor
【问题概数】:给你一个整数n。检查n是否有一个大于1的奇数除数(是否存在这样一个数x(x>1),n可以被x整除,x是奇数)。
例如,如果n=6,那么x=3。如果n=4,那么这样的数字就不存在了。
【算法思想】:如果数字x有一个奇数除数,那么它就有一个奇数素数除数。为了理解这个事实,我们可以考虑偶数和奇数相乘时会发生什么:
偶数*偶数=偶数
偶数*奇数=偶数
奇数*偶数=偶数
奇*奇=奇
只有一个偶数素数——2。所以,如果一个数没有奇数除数,那么它一定是2的幂。例如,你可以把N除以2,只要它是可分的,如果最后我们得到1,那么N就是的幂。
所以我们可以通过检测:如果一个数是2的幂,那么这个数就不是奇数除数;反之,这个数就是奇数除数。
那么,怎么检测一个数是不是2的幂呢?通过二进制数的相关知识,我们知道:如果一个数是2的幂,那么该数n表示为二进制数之后,只有最高位为1,其余位均为0;(n-1)只有最高位为0,其余位均为1。
通过位运算的相关知识:n&(n-1),例如:5 & 4 = 101 & 100 = 100 ,所以5不是2的幂,5是奇除数;8 & 7 = 1000 & 0111 = 0000 ,8是2的幂,不是奇除数。
【代码实现】(标准答案)
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
void solve()
{
ll n;
cin >> n;
if (n & (n - 1))
{
cout << "YES\n";
}
else
{
cout << "NO\n";
}
}
int main()
{
int t;
cin >> t;
while (t--)
{
solve();
}
}