J爱学习 发表于 2021-11-8 21:48:38

为啥这个程序不能判断2的n次幂呢???

#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

jhq999 发表于 2021-11-8 21:58:09

本帖最后由 jhq999 于 2021-11-8 22:41 编辑

int main()
{

    int a, b, c, d;
    scanf("%d", &a);
    b=0;
        c=a;
        d=0;
   

       if (a<0)//负数=
      {
                a=~a+1;
      }
    while(a)
    {
      b+=a&1;
        if(b==0)d++;
      if(b>1)break;
      a>>=1;
      
    }
    if(b==1)
            printf("YES,是2的%d次幂",d);
      else
            printf("NO");

        return 0;
}

jackz007 发表于 2021-11-8 22:20:55

本帖最后由 jackz007 于 2021-11-8 22:31 编辑

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

bool foo(long long n)
{
      if(n == 1LL || n == -1LL) return true ;
      else if(n % 2LL) return false         ;
      else return foo(n / 2LL)            ;
}

int main(void)
{
      long long n                           ;
      scanf("%I64d" , & n)                  ;
      if(foo(n)) printf("Yes\n")            ;
      else printf("No\n")                   ;
}
      编译、运行实况;
D:\00.Excise\C>g++ -o x x.c

D:\00.Excise\C>x
8
Yes

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

D:\00.Excise\C>x
16
Yes

D:\00.Excise\C>x
32
Yes

D:\00.Excise\C>x
30
No

D:\00.Excise\C>

J爱学习 发表于 2021-11-8 22:22:03

jhq999 发表于 2021-11-8 21:58


谢谢,那请问如果输入的是-165587175的话,这代码要如何改呢

J爱学习 发表于 2021-11-8 22:26:08

jackz007 发表于 2021-11-8 22:20
2 的 n 次幂是这样判定的吗?

      编译、运行实况;

可以试试更大的数吗,还有负数,我是初学者,对此还不够了解

jackz007 发表于 2021-11-8 22:29:25

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

      当然,3楼的代码你编译运行测试一下呢。

J爱学习 发表于 2021-11-8 22:31:43

jackz007 发表于 2021-11-8 22:29
当然,3楼的代码你编译运行测试一下呢。

嗯嗯,我刚刚试过了,输入正数没有问题,可输入负数就无法运行了

jackz007 发表于 2021-11-8 22:33:19

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

          3 楼的代码针对负数和64位整数做了修改,现在再测。

J爱学习 发表于 2021-11-8 22:35:39

jhq999 发表于 2021-11-8 21:58


非常感谢

J爱学习 发表于 2021-11-8 22:36:08

jackz007 发表于 2021-11-8 22:33
3 楼的代码针对负数和64位整数做了修改,现在再测。

嗯嗯,谢谢前辈提醒

jhq999 发表于 2021-11-8 22:39:06

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

//负数在前面加上       

if (a<0)
        {
                a=~a+1;
        }
页: [1]
查看完整版本: 为啥这个程序不能判断2的n次幂呢???