检查数字中是否有数字“0”的最快方法是什么?
我需要开发一种快速方法,因为我必须在20美元以下的时间内以接近$ 10 ^ 9 $的数字执行这些检查。
将它转换成字符串后会搜索零吗?
答案 0 :(得分:14)
除了2美元以外的数字除以数字将采用相同数量的操作,无论数字是多少。因此,不要反复将$ x $除以$ 10 $并测试每个余额对$ 0 $,考虑重复将$ x $除以$ 10 ^ 6 $(比如说)并在$ [0,10 ^ 6]的查找表上测试每个余数$。如果余数包含内部零,则查找表应为“是”,如果不包含零则为“否”,如果余数仅包含初始零,则为“可能”(在这种情况下,检查$ x $当前是非零并返回)相应的“是”或“否”。
答案 1 :(得分:1)
如果您可以编写程序集或强制编译器执行整数除法,则重复执行$ 10 $的整数除法,直到余数为$ 0 $或被除数为$ 0 $。如果是剩余部分,则会有一个" $ 0 $"数字。如果是股息,则没有" $ 0 $"数字。
答案 2 :(得分:1)
二进制零:如果有零位,则(~x)将为非零。我的猜测是你不关心二进制数字。
如果您的数据以字符串形式开头,请保持这种状态。如果没有,请勿转换为字符串,然后检查。转换为字符串比检测零位数所做的工作更多。这可能是特定于语言的。在c或汇编中,转换速度将慢于您自己的检测算法。
例如,如果您将基数为10的数字存储为整数(如c),则可以创建包含1000个条目的查找表。查找[100] = 1,查找[123] = 0等等。然后,您必须将输入数字除以1000而不是10.其余部分是查找索引。这可能比除以10快3倍。一个小的查找表适合缓存。太大的桌子,你会因为公羊这么慢而导致性能下降。在c中,无符号整数可能比有符号整数更快,因为优化器可能会采用一些快捷方式。
最后,考虑多个线程。
答案 3 :(得分:0)
我需要开发一种快速方法,因为我必须在20秒内对接近109个数字执行这些检查。
啊,编程问题。
将它转换成字符串后会搜索零吗?
如果您输入到输入的所有内容都是其自身行上没有前导或尾随零的数字,那么/ 0 /就可以了。但是,是的,字符串将是最快的。对于混合中使用零或非数字的更复杂的表示,那么您将使用此正则表达式来表示整数:
/^[1-9]+0[0-9]*$|^0$/
这需要一个具有非前导零的数字,或者数字为零。它也假定为整数。
$ cat numbers
375
391
940
493
566
804
800
453
726
527
428
77
984
510
795
077
0
$ egrep '^[1-9]+0[0-9]*$|^0$' numbers
940
804
800
510
0
如果它们是固定宽度,则十进制数字可能会更具挑战性。如果没有,除非你的小数开始是'0.nnn'而不是'.nnn',否则在两个括号中添加一个句点就足够了。告诉我你的号码,我会帮你解决问题。
答案 4 :(得分:0)
这是一些Mathematica代码,它在数字中每个数字进行一次除法。
n = 34560116; d = IntegerLength[n]; m = 0; x = 1;
While[d >= x, If[m == (k = Mod[n, 10^(x++)]), Break[], m = k]];
If[d >= x, Print["First zero found at: ", 10^(x - 2)]];
First zero found at: 1000