| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4231 人关注过本帖
标题:[求助]如何判断一个数字不是3的幂?
只看楼主 加入收藏
zbqf109
Rank: 1
等 级:新手上路
帖 子:289
专家分:0
注 册:2006-12-31
收藏
得分:0 

以下是csdn的网友提出的几种方法,仅供参考。

(1)

3^n = (2+1)^n = C(n,0)*2^0*1^n+C(n,1)*2^1*1^(n-1)+....+C(n,n)*2^n*1^0

=C(n,0)*2^0+C(n,1)*2^1+C(n,2)*2^2+....+C(n,n)*2^n

=1+C(n-1)*2^1+C(n,2)*2^2+...+C(n,n)*2*n

有网友说: 判断 3^n-1 这个数是不是2的幂,然后利用本版以前讨论那个(n&(n-1))来
判断n是不是2的幂。这个不是充分必要条件,但是思想确实不错。

(2)

第一题:

测试函数:

template<class Integer>

bool isPow3(const Integer & n);

测试代码:

int main()

{

using namespace std;

typedef long __Type;

long start = clock();

for(__Type i = 0;i <= 100000000;++i)

if(isPow3(i))

cout<<i<<" ";

start = clock() - start;

cout<<endl<<"Time: "<<start<<endl;

}

原理1:用乘法,判断等于

版本1:

template<class Integer>

bool isPow3(const Integer & n){

Integer p = 1;

while(p < n)

p *= 3;

return p == n;

}

结果:

1 3 9 27 81 243 729 2187 6561 19683 59049 177147 531441 1594323 4782969 1434
8907 43046721

Time: 2531

版本2:

template<class Integer>

bool isPow3(const Integer & n){

Integer p = 1;

while(p < n)

p *= 9;

return p == n || p == n * 3;

}

结果:

1 3 9 27 81 243 729 2187 6561 19683 59049 177147 531441 1594323 4782969 1434
8907 43046721

Time: 1265

版本3:

template<class Integer>

bool isPow3(const Integer & n){

Integer p = 1;

while(p < n)

p *= 27;

return p == n || p == n * 3 || p == n * 9;

}

结果:

1 3 9 27 81 243 729 2187 6561 19683 59049 177147 531441 1594323 4782969 1434
8907 43046721

Time: 1328

原理2:预先保存好所有结果,折半查找

版本4:

template<class Integer>

bool isPow3(const Integer & n){

static const Integer POW_3[18] =

{1,3,9,27,81,243,729,2187,6561,19683,59049,177147,531441,1594323,478
2969,14348907,43046721,129140163};

static const std::set<Integer> RESULT(POW_3,POW_3 + 18);

return !(RESULT.find(n) == RESULT.end());

}

结果:

1 3 9 27 81 243 729 2187 6561 19683 59049 177147 531441 1594323 4782969 1434
8907 43046721

Time: 3875

结论是版本2最快,预置结果的版本4不能和版本2,3相比,毕竟查找也要时间。


坚决不跟用TC的人打交道!
2007-01-20 17:35
zbqf109
Rank: 1
等 级:新手上路
帖 子:289
专家分:0
注 册:2006-12-31
收藏
得分:0 
以下是引用福尔摩斯在2007-1-20 17:35:47的发言:

你是数学非常不好呀

你看看12是3的倍数,但不是3的幂

12=2^2 * 3

像9=3^2,像27=3^3才是3的幂

知道不

对不起,我晕了。


坚决不跟用TC的人打交道!
2007-01-20 17:37
sunyuantz
Rank: 1
等 级:新手上路
威 望:1
帖 子:407
专家分:0
注 册:2006-3-20
收藏
得分:0 
昨天做这题做到今天5点,所以睡到现在才起,看了大家讨论觉得很不错,首先5楼的n%3==0肯定不行因为这是求3的倍数不是求3的冪,我只想求3的冪,其他不想.11楼其实我也看过这些,但觉的有些深,看不懂.我有一个思路但估计实现不了思路如下:
设一个数为N,且N为3的冪,N=3^n,log(3,N)=n,ln3/lnN=n,若两数相除为整数则一定为三的冪,不知对不对

我不是名人,所以不要签名。等哪天我成名人了......你都认识我了还要签名干嘛!
2007-01-20 18:22
sunyuantz
Rank: 1
等 级:新手上路
威 望:1
帖 子:407
专家分:0
注 册:2006-3-20
收藏
得分:0 
晕死,犯了个天大的错误,浮点小数是无法比较的也就是2.000000000和2.0000000001是无法比较的,这下我没辙了,唉!

我不是名人,所以不要签名。等哪天我成名人了......你都认识我了还要签名干嘛!
2007-01-20 18:47
福尔摩斯
Rank: 5Rank: 5
等 级:贵宾
威 望:12
帖 子:4011
专家分:370
注 册:2006-8-15
收藏
得分:0 
以下是引用sunyuantz在2007-1-20 18:22:25的发言:
昨天做这题做到今天5点,所以睡到现在才起,看了大家讨论觉得很不错,首先5楼的n%3==0肯定不行因为这是求3的倍数不是求3的冪,我只想求3的冪,其他不想.11楼其实我也看过这些,但觉的有些深,看不懂.我有一个思路但估计实现不了思路如下:
设一个数为N,且N为3的冪,N=3^n,log(3,N)=n,ln3/lnN=n,若两数相除为整数则一定为三的冪,不知对不对

转化错了

是ln N/ln 3=n

但是有一个问题,就是你如何判断它是个整数?(这个问题很困难)

至于你后来说得那个问题,我觉得你可以用先放大,再比较相对误差的方法得到解决


自我放逐。。。
2007-01-20 19:31
sunyuantz
Rank: 1
等 级:新手上路
威 望:1
帖 子:407
专家分:0
注 册:2006-3-20
收藏
得分:0 
谢谢楼上的各位,这题我想出来解法如下:
#include<stdio.h>
int main()
{
int x=3,n;
scanf("%d",&n);
if(n==3) printf("yes!");
else
{
do
{
x+=x*2;
}while(x<n);
if(x==n) printf("yes");
else printf("no");
}
getch();
return 0;
}
ps:3的冪可以看成是3*3……*3(n个3相乘),3的2进制为11,所以3*3=11*11即110+11,同理27=9*3=1001*11=10010+11,可以得出如下结论,3的冪可以写成N=3^(n-1)*2+3^(n-1),最后让N无限逼近目标M,看M是否为N就可以了
就是不知道执行时间是多少,不知道谁可以帮我做个测试,感激不禁啊!

我不是名人,所以不要签名。等哪天我成名人了......你都认识我了还要签名干嘛!
2007-01-20 22:14
福尔摩斯
Rank: 5Rank: 5
等 级:贵宾
威 望:12
帖 子:4011
专家分:370
注 册:2006-8-15
收藏
得分:0 

我试了下你的代码

不可以

有错误


自我放逐。。。
2007-01-21 07:44
高达
Rank: 1
等 级:新手上路
威 望:1
帖 子:261
专家分:0
注 册:2006-10-27
收藏
得分:0 

但是有一个问题,就是你如何判断它是个整数?(这个问题很困难)

(先声明我数学不好)
我想 用 temp 把目标数存起来
然后 把目标数 强制转换为整形
然后 把temp 和 强制转换后的目标数 比较
如果相等....
例如
#include<stdio.h>
main()
{
float n=1.5,temp;
temp=n;
if((int)n==temp)
printf("yes");
else printf("no");
}
结果 NO


哎 时间....................
2007-01-21 13:12
zengxz
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2007-1-21
收藏
得分:0 

int CheckIsPowerofThree(int n) //判断是否是3的冪
{
int i=0;
while(power(3,i)<n) i++; //power()是一数学库函数
if(power(3,i)==n) return 1;
else return 0;
}

哥们,这个怎么样?望大家指正
2007-01-21 14:50
高达
Rank: 1
等 级:新手上路
威 望:1
帖 子:261
专家分:0
注 册:2006-10-27
收藏
得分:0 
我按这个思路写的ln N/ln 3=n

#include<stdio.h>
#include<math.h>
main()
{
double x;
double n,temp;
for(x=1;x<100000000;x++)
{

n=log(x)/log(3);
temp=n;
if((int)n==temp)
printf("%ld\n",(long int)x);
}
}

[此贴子已经被作者于2007-1-21 15:11:58编辑过]


哎 时间....................
2007-01-21 15:01
快速回复:[求助]如何判断一个数字不是3的幂?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026018 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved