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