鱼C论坛

 找回密码
 立即注册
查看: 1392|回复: 10

[已解决]为啥这个程序不能判断2的n次幂呢???

[复制链接]
发表于 2021-11-8 21:48:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a, b, c, d;
    scanf("%d", &a);

    while(-9999999999 <= a && a <= 9999999999)
    {
        if(a % 2 == 0)
            printf("YES");
        else
            printf("NO");

        break;
    }

    return 0;
}

当我输入100662788时本应该是no的,可结果却为YES
最佳答案
2021-11-8 21:58:09
本帖最后由 jhq999 于 2021-11-8 22:41 编辑
  1. int main()
  2. {

  3.     int a, b, c, d;
  4.     scanf("%d", &a);
  5.     b=0;
  6.         c=a;
  7.         d=0;
  8.      

  9.        if (a<0)//负数=
  10.         {
  11.                 a=~a+1;
  12.         }
  13.     while(a)
  14.     {
  15.         b+=a&1;
  16.         if(b==0)d++;
  17.         if(b>1)break;
  18.         a>>=1;
  19.       
  20.     }
  21.     if(b==1)
  22.             printf("YES,是2的%d次幂",d);
  23.         else
  24.             printf("NO");

  25.         return 0;
  26. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-11-8 21:58:09 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jhq999 于 2021-11-8 22:41 编辑
  1. int main()
  2. {

  3.     int a, b, c, d;
  4.     scanf("%d", &a);
  5.     b=0;
  6.         c=a;
  7.         d=0;
  8.      

  9.        if (a<0)//负数=
  10.         {
  11.                 a=~a+1;
  12.         }
  13.     while(a)
  14.     {
  15.         b+=a&1;
  16.         if(b==0)d++;
  17.         if(b>1)break;
  18.         a>>=1;
  19.       
  20.     }
  21.     if(b==1)
  22.             printf("YES,是2的%d次幂",d);
  23.         else
  24.             printf("NO");

  25.         return 0;
  26. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-8 22:20:55 | 显示全部楼层
本帖最后由 jackz007 于 2021-11-8 22:31 编辑

          2 的 n 次幂是这样判定的吗?
  1. #include <stdio.h>

  2. bool foo(long long n)
  3. {
  4.         if(n == 1LL || n == -1LL) return true ;
  5.         else if(n % 2LL) return false         ;
  6.         else return foo(n / 2LL)              ;
  7. }

  8. int main(void)
  9. {
  10.         long long n                           ;
  11.         scanf("%I64d" , & n)                  ;
  12.         if(foo(n)) printf("Yes\n")            ;
  13.         else printf("No\n")                   ;
  14. }
复制代码

        编译、运行实况;
  1. D:\00.Excise\C>g++ -o x x.c

  2. D:\00.Excise\C>x
  3. 8
  4. Yes

  5. D:\00.Excise\C>x
  6. 6
  7. No

  8. D:\00.Excise\C>x
  9. 16
  10. Yes

  11. D:\00.Excise\C>x
  12. 32
  13. Yes

  14. D:\00.Excise\C>x
  15. 30
  16. No

  17. D:\00.Excise\C>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-8 22:22:03 | 显示全部楼层

谢谢,那请问如果输入的是-165587175的话,这代码要如何改呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-8 22:26:08 | 显示全部楼层
jackz007 发表于 2021-11-8 22:20
2 的 n 次幂是这样判定的吗?

        编译、运行实况;

可以试试更大的数吗,还有负数,我是初学者,对此还不够了解
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-8 22:29:25 | 显示全部楼层
J爱学习 发表于 2021-11-8 22:26
可以试试更大的数吗,还有负数,我是初学者,对此还不够了解

      当然,3楼的代码你编译运行测试一下呢。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-8 22:31:43 | 显示全部楼层
jackz007 发表于 2021-11-8 22:29
当然,3楼的代码你编译运行测试一下呢。

嗯嗯,我刚刚试过了,输入正数没有问题,可输入负数就无法运行了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-8 22:33:19 | 显示全部楼层
J爱学习 发表于 2021-11-8 22:31
嗯嗯,我刚刚试过了,输入正数没有问题,可输入负数就无法运行了

          3 楼的代码针对负数和64位整数做了修改,现在再测。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-8 22:35:39 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-8 22:36:08 | 显示全部楼层
jackz007 发表于 2021-11-8 22:33
3 楼的代码针对负数和64位整数做了修改,现在再测。

嗯嗯,谢谢前辈提醒
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-8 22:39:06 | 显示全部楼层
J爱学习 发表于 2021-11-8 22:26
可以试试更大的数吗,还有负数,我是初学者,对此还不够了解

  1. //负数在前面加上       

  2. if (a<0)
  3.         {
  4.                 a=~a+1;
  5.         }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-25 22:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表