Codeforces Round #697 (Div. 3) A. Odd Divisor

A. Odd Divisor

简单来说,就是判断一个数有没有奇数的除数。

思路1

首先奇数一定符合,因为题目中没说本身不行

然后就来看偶数了,偶数一定是2的倍数,我们把它除以2,就得到了一个它的约数,如果这个约数是个奇数且不为1,那么就符合题意;如果还是个偶数,我们可以继续往下除2来判断他是不是一个符合题意(有奇数除数的数)。如果中途出现了奇数,那就是yes;如果除到1发现没有奇数,那就是no

		if(n % 2 == 1){
            printf("YES\n");
            continue;
        }
        else{
            n /= 2;
            if(n % 2 == 1 && n != 1){
                printf("YES\n");
                continue;
            }
            else{
                while(n != 1 && n % 2 == 0){
                    n /= 2;
                }
                if(n == 1){
                    printf("NO\n");
                }
                else{
                    printf("YES\n");
                }
            }
                

思路2

每个数都可以质因数分解,而质数中的偶数只有2,如果一个数的质因数分解存在除2以外的数,那么一定是yes(奇数的任何次幂都为奇数)

那么就可以判断这个数是不是2的幂次就可以了

        if ((int)log2(n) == log2(n)){ //质因数分解,每个数都能质因数分解,如果这个数分解出来只能为2的幂次,那他肯定不符合题意
            printf("NO\n");
        }
        else{
            printf("YES\n");
        }


思路2.5

这是官方题解的做法,我们还可以想,把这个数转为2进制。

二进制恢复到10进制就一定是n*2^0 + n * 2^1 + …

如果一个数是2的幂次,他的二进制表示一定是最前面的是1其他皆为0,因为任何一个数只要除了最高位不是1以外存在其他位也有1的情况,就会使得这个数不是2的幂次(感觉好像在说废话)

判断是不是最高位是1其他都是0就需要判断 n&(n - 1)是不是0。如果是0就是no。

if (n & (n - 1)) {
    cout << "YES\n";
  } else {
    cout << "NO\n";
  }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值