今天在优快云上看了一个帖子,回贴人是如此之多,引起了我的兴趣,把这个整理了一下,对自己也是提高。
http://community.youkuaiyun.com/Expert/topic/5304/5304123.xml?temp=.6896479
解决方法基本上有四种,分别是用除法、乘法,查表和位操作来实现。但位操作的我试了一下没有成功的。 找了几个比较好的,总结一下。
除法:
这也不算完整的除法,
#include
<
iostream
>
using namespace std;
bool is3ny (unsigned
long
num)
...
{
unsigned long k;
if (0==num) return false;
if ((1==num)||(3==num))
return true;
if (num%9!=0)
return false;
k=3;
while(k<num)
...{
if(0 != num % (3*k))
return false;
k *= 3;
}
return true;
}

int
main()
...
{
for(unsigned long i=0;i<=135670000;++i)
...{
if (is3ny(i) )
cout<<i<<endl;
}
return 0;
}
明眼人一看就知道算法缺点了,完全是通常思路,没有新意。
查表的:
#include
<
iostream
>
#include
<
limits
>
#include
<
vector
>
#include
<
algorithm
>
#include
<
iterator
>

using namespace std;
int
main(
void
)
...
{
vector<int> powerOf3;
int i = 1;
while (i < numeric_limits<int>::max()/3)
...{
i *= 3;
powerOf3.push_back(i);
}
copy(powerOf3.begin(), powerOf3.end(), ostream_iterator<int>(cout, " "));
while (true)
...{
cout << "Input a number : " << endl;
int input;
cin >> input;
if (binary_search(powerOf3.begin(), powerOf3.end(), input))
...{
cout << input << " is power of 3." << endl;
}
else
...{
cout << input << " is not power of 3." << endl;
}
}
return 0;
}
制表有时间和空间开销,显然也不是最好的。
再看看用乘法的
bool judge(
int
x,
int
y
=
1
)
...
{
if(x == y)return true;
else if(x < y)
return false;
else
...{
y *= 3;
return judge(x, y);
}
}
这已经接近提问者的目标了,但缺点却出在使用了递归上,在层次比较多的时候,递归还是很要命的,幸亏是3的幂,用不了几次递归。
总结了一下,自己写了一个
#include
<
iostream.h
>
int
main()
...
{
int i = 1;
int TestNum = 1;
if(TestNum > 1)
...{
while(i < TestNum)
...{
i *= 3;
}
}
if(i == TestNum)
cout<<"Y"<<endl;
return 0;
}
其实这题目并没有什么难人之处,关键是打破常规,好多人都用MOD用习惯了,而此题目如果用取余来看,判断的情况就相当的多,也相当复杂,反其道而用之,用乘法,用简洁多了,这未必对自己不是一个警视。
本文介绍了几种判断一个数是否为3的幂的有效方法,包括直接除法、预先生成幂次表进行查找、递归乘法及非递归的迭代乘法等方案,并对每种方法进行了优劣分析。
2961

被折叠的 条评论
为什么被折叠?



