1
explon 2013 年 1 月 14 日 截取第一字节啊
|
2
NemoAlex 2013 年 1 月 14 日
不同语言的写法不同,楼主想要哪种
|
5
itommy 2013 年 1 月 14 日 via iPhone
%10 = 1 ?
|
7
m OP 我忘了说似乎是挺重要的一点
1111=false 12000=false 1230=false 101=false 也就是仅判断是否是1后面跟了0 |
8
clww 2013 年 1 月 14 日
应该是除以10...
|
10
itommy 2013 年 1 月 14 日 via iPhone
|
11
NemoAlex 2013 年 1 月 14 日
楼主完全没有描述清楚想要找什么...
|
12
bitsmix 2013 年 1 月 14 日
/^10*$/.test(number)
|
14
miaoever 2013 年 1 月 14 日
取每一位,然后加起来等于1?
|
15
yyai3 2013 年 1 月 14 日 log
|
16
Sunyanzi 2013 年 1 月 14 日 我其实挺想帮 LZ 以便换到某论坛的邀请码的 ... 但我不太理解需求 ...
(T) 1 (F) 2 (T) 10 (F) 11 (F) 99 (T) 100 (F) 101 (F) 150 (T) 1000 (F) 1001 如果是我上面描述的那样 ... 以 10 为底取对数也就是 lg ... 判断结果是否为整数即可 ... |
17
alexrezit 2013 年 1 月 14 日 bool Blah(int i)
{ if (i > 10) { return Blah(i/10); } else { return i == 1; } } |
18
forest520 2013 年 1 月 14 日 for(; n % 10==0 && n > 1; n /= 10);
result = (n == 1); |
24
Air_Mu 2013 年 1 月 14 日 不懂程序
大概是循环判断此变量是否大于10 如果大于10就除以10 直到其小于10. 返回此时的值。(设为x) 如果100<=x*100<=110就返回真。 比如1024 得出x为1.024 真 咳咳 |
25
Air_Mu 2013 年 1 月 14 日
修正下 应该是如果大于10就除以10 直到其小于等于10
|
26
Air_Mu 2013 年 1 月 14 日
再修:
如果100<=x*100<110就返回真 |
27
blacktulip 2013 年 1 月 14 日 。。。。。。
def one_zero?(number) return true if Math.log10(number) % 1 == 0 return false end p one_zero?(1000) # => true p one_zero?(2000) # => false p one_zero?(1200) # => false |
29
reusFork 2013 年 1 月 14 日 def starts_with_digit_1(n):
return n / (10 ** (math.log10(n))) == 1 |
30
blacktulip 2013 年 1 月 14 日
@m 那不是公式,是正则匹配
|
31
dadastan 2013 年 1 月 14 日
s/10*/
|
33
Sunyanzi 2013 年 1 月 14 日 @Air_Mu
<?php var_dump( check( 1 ) ); var_dump( check( 10 ) ); var_dump( check( 11 ) ); function check( $number ) { $checker = log10( $number ); return ( $checker == intval( $checker ) ); } // 这样可以么 ..? 不可以的话我想办法写一个 Java 版本的恩 ... |
34
Sunyanzi 2013 年 1 月 14 日
我我 ... 我 @ 错人了 ... 是 @ LZ 来着 ...
|
35
Air_Mu 2013 年 1 月 14 日
面红耳赤.....完全忘记对数是什么了...去wiki了下看了半天居然还没理解。
初中的时候明明觉得很简单的..... |
36
tioover 2013 年 1 月 14 日
转成科学计数法以后再判断……
|
37
blacktulip 2013 年 1 月 14 日
@Air_Mu 比方说 十的五次方是一万, 那么 一万的以十为底的对数就是五 ,一种记数方法而已。
|
38
blacktulip 2013 年 1 月 14 日
@Air_Mu 哈哈,脑子糊涂了,十的五次方是十万才对,不好意思,不过对数就那个意思
|
39
Air_Mu 2013 年 1 月 14 日
@blacktulip 哎 惭愧...中学时期数学一直挺好的。大学后荒置后完全忘记了.
|
40
CoX 2013 年 1 月 14 日 来个python的吧
n = str(n) n[:1]=="1" and int(n[1:] + "0")==0 |
41
Sunyanzi 2013 年 1 月 14 日 @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; } |
42
Mutoo 2013 年 1 月 14 日 这不是很笑意吗。。消去后面所有零,然后判断最后是不是为1就行了。
while(!(a%10))a/=10; return a==1; |
43
m OP 谢谢各位,问题已解决,
使用对数是最好的方案,优雅,准确,表达式为: Math.log10(number)%1==0 相对而言用正则违反题意,需要转string 循环除10则略傻 @Sunyanzi 说的效率问题,与增加逻辑复杂度来说,应该可以忽略了 |
46
Sunyanzi 2013 年 1 月 14 日 那么那么 ... 如果有帮助的话 ... 顺求某个你懂的论坛的邀请 ...
前几天来晚了哭泣 ... _________@________.__ webmaster_sunyanzi_cn @alexrezit 不是爱不爱用 ... 关键是这个事情为什么要 recursion ..? function huh( $number ) { if ( $number < 10 ) { if ( 1 == $number ) return true; else return false; } else return huh( $number / 10 ); } 写成这样的好处何在呢 ..? |
52
013231 2013 年 1 月 15 日 既然你决定使用math.log10(x) % 1 == 0,说明你想匹配的是形如/10+/的数字。这种数字相当有限,完全可以不使用缓慢的log,直接查表即可。
先估算一下x可能的范围,假设x <= 10**19: http://gist.github.com/4531249 |
54
haohaolee 2013 年 1 月 15 日
我表示怀疑,对数真的不会产生误差?以至于还要考虑 floor 或者 round?
查表那个很有意思啊 |
56
Mutoo 2013 年 1 月 15 日
取对数的效率太低了吧,还有一个问题,对数产生的是浮点数,而%取余是整型运算,误差就不说了。
|
57
Mutoo 2013 年 1 月 15 日 |
59
Mutoo 2013 年 1 月 15 日
@m 对数 - 维基百科 http://zh.wikipedia.org/wiki/%E5%AF%B9%E6%95%B0
|
60
Mutoo 2013 年 1 月 15 日 @m log的内部实现比循环取余更ugly,只是你看不到……你要是觉得循环取余难看,就把他封装成函数,丢一边去。函数体也就2行(见42楼),取个好听点的名字就行了。
|
61
2lbj 2013 年 1 月 15 日
我去不是这么复杂吧?!!
|
62
2lbj 2013 年 1 月 15 日
这种事情果断用正则表达式啊?
|
63
xpfd 2013 年 1 月 15 日
不断的对10取余 余数不为0 返false 然后除10 判断是不是1或者0
|
65
m OP 我测试了一下执行效率,测试结果如下:
regex : used:706657ns log10 : used:23906ns contains: used:11346ns while : used:1216ns 可见使用正则是最慢的,整整706657ns @2lbj 我使用的测试代码如下: //regex boolean is10=(""+n).matches("^10*$"); //log10 boolean is10=Math.log10(n)%1==0; //contains boolean is10=TEN.contains(n); //while while(true){ n=n/10; if(n==1){ return true; }else if(n<10){ return false; } } BTW:我最终还是使用了log10方法进行判断 |
67
picasso250 2013 年 1 月 15 日
目测52楼效率最高。log10的方案目测应该比循环除还慢(毕竟循环除是整数除法,而log10应该是double的除法)。
|
69
sangwei 2013 年 1 月 15 日 给个最土的思路:
//32 位 int -2,147,483,648 ~ +2,147,483,647 if (x == 1 or x == -1) return true; if (x == 10 or x == -10) return true; ... if (x == 1,000,000,000 or x == -1,000,000,000) return true; return false; |