方法一:
拿这个数来除以2,得到商和余数,再用商除以2,又得到商和余数,重复上面的操作,直到商为0,当商为0,余数也为0时,这个数就是2的整数次幂当商为0,余数不为0时,这个数就不是2的整数次幂。
程序如下:
#include <iostream>
using namespace std;
int fun(int n)
{
if(n==1)
return 1;
else
{
do
{
if(n%2==0)
n/=2;
else
return 0;
}
while(n!=1);
return 1;
}
return 0;
}
int main() //根号2的故事--判断一个数是不是2的整数次幂
{
int n;
while(cin>>n)
{
if(fun(n)==1)
cout<<"ACM"<<endl;
else
cout<<"MCA"<<endl;
}
return 0;
}
方法二:
将2的幂次方写成二进制形式后,很容易就会发现有一个特点:二进制中只有一个1,并且1后面跟了n个0; 因此问题可以转化为判断1后面是否跟了n个0就可以了。
如果将这个数减去1后会发现,仅有的那个1会变为0,而原来的那n个0会变为1;因此将原来的数与去减去1后的数字进行与运算后会发现为零。
最快速的方法:
(number & number - 1) == 0
程序如下:
#include <iostream>
using namespace std;
int main() //判断一个数是不是2的整数次幂
{
int n;
while(cin>>n)
{
if((n&(n-1))==0) //此处注意运算符的优先级,“==”比“&”优先级高
cout<<"ACM"<<endl;
else
cout<<"MCA"<<endl;
}
return 0;
}