如何判断一个数字是1开头?

2013-01-14 17:19:15 +08:00
 m
例如变量值为:
1000
200
900000

我要判断1000时返回true
同样
1=true
10 = true
100=true

其他非1开头都为false

用什么算法可以判断?(除了转为string之外)
6476 次点击
所在节点    问与答
70 条回复
Sunyanzi
2013-01-14 19:04:19 +08:00
@m 关于效率对比 ...

$number = 1;
循环 0.000678062
对数 0.001754999

$number = 10;
循环 0.000564098
对数 0.001772165

$number = 10000000;
循环 0.000665903
对数 0.001778841

$number = bcpow( 10, 32 ); // 10^32
循环 0.000611066 ( 结果错误 )
对数 0.001586914


不过事实看来 ... 在 php 里面对数的效率完全不如做多次除法 ...

对数的唯一优势在于如果一个数字特别大 ... 超过了整数可以处理的范围 ...

当除法无法计算的时候对数永远可以给出正确的答案这样 ...

附我的连续除法程序 ...

while ( true ) {

if ( $number < 10 ) {

if ( 1 == $number ) return true;

else return false;

} else $number /= 10;

}
Mutoo
2013-01-14 19:23:58 +08:00
这不是很笑意吗。。消去后面所有零,然后判断最后是不是为1就行了。

while(!(a%10))a/=10;
return a==1;
m
2013-01-14 22:11:37 +08:00
谢谢各位,问题已解决,

使用对数是最好的方案,优雅,准确,表达式为:
Math.log10(number)%1==0

相对而言用正则违反题意,需要转string

循环除10则略傻

@Sunyanzi 说的效率问题,与增加逻辑复杂度来说,应该可以忽略了
alexrezit
2013-01-14 22:15:38 +08:00
@Sunyanzi
你们都不爱用 recursion 么?
m
2013-01-14 22:20:15 +08:00
@alexrezit 这不是没必要专门写个递归函数来做这个么, log10大赞,虽然已经完全不知道对数是干嘛的了
Sunyanzi
2013-01-14 22:21:35 +08:00
那么那么 ... 如果有帮助的话 ... 顺求某个你懂的论坛的邀请 ...

前几天来晚了哭泣 ...

_________@________.__
webmaster_sunyanzi_cn

@alexrezit 不是爱不爱用 ... 关键是这个事情为什么要 recursion ..?

function huh( $number ) {

if ( $number < 10 ) {

if ( 1 == $number ) return true;

else return false;

} else return huh( $number / 10 );

}

写成这样的好处何在呢 ..?
m
2013-01-14 22:32:48 +08:00
@Sunyanzi 我已经精尽人亡挤不出码了,产量极其有限啊!只能发感谢了
Sunyanzi
2013-01-14 22:35:46 +08:00
@m 喔喔那好吧 ... 果然来晚了就是来晚了 ...

恩恩 ... thanks all the same ...
alexrezit
2013-01-14 22:47:08 +08:00
@m
@Sunyanzi
Recursion 思路不是更简单么? 难道 recursion 会降低效率?
txx
2013-01-14 23:21:30 +08:00
@alexrezit 更喜欢写while ...当初做数据结构练习的时候 递归导致了栈溢出= =......
m
2013-01-14 23:25:10 +08:00
@alexrezit 因为提高逻辑复杂度,不妥
013231
2013-01-15 00:30:56 +08:00
既然你决定使用math.log10(x) % 1 == 0,说明你想匹配的是形如/10+/的数字。这种数字相当有限,完全可以不使用缓慢的log,直接查表即可。
先估算一下x可能的范围,假设x <= 10**19:
http://gist.github.com/4531249
CoX
2013-01-15 00:56:15 +08:00
@013231 这效率应该最高了吧
haohaolee
2013-01-15 01:46:53 +08:00
我表示怀疑,对数真的不会产生误差?以至于还要考虑 floor 或者 round?
查表那个很有意思啊
laskuma
2013-01-15 02:39:43 +08:00
@m 觉得LZ要是在代码里试用对数 那才是逻辑复杂 非常不妥
Mutoo
2013-01-15 09:08:50 +08:00
取对数的效率太低了吧,还有一个问题,对数产生的是浮点数,而%取余是整型运算,误差就不说了。
Mutoo
2013-01-15 09:09:46 +08:00
@Mutoo (没打完不小心按回复)

javascript:

Math.log(100000000000000000001)/Math.log(10)%1==0 //true
m
2013-01-15 09:15:40 +08:00
@Mutoo 是log10算法效率低下?我都不知道对数是干嘛的了
什么是代替方案?存个表还是正则匹配?
Mutoo
2013-01-15 09:22:39 +08:00
Mutoo
2013-01-15 09:24:33 +08:00
@m log的内部实现比循环取余更ugly,只是你看不到……你要是觉得循环取余难看,就把他封装成函数,丢一边去。函数体也就2行(见42楼),取个好听点的名字就行了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/57554

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX