Algorithm 检查数字是否具有';数字';里面有零吗?

Algorithm 检查数字是否具有';数字';里面有零吗?,algorithm,Algorithm,检查数字中是否有数字“0”的最快方法是什么 我需要开发一种快速方法,因为我必须在不到20美元的时间内对接近10^9美元的数字执行这些检查 将零转换为字符串后搜索它是否有效?如果您可以编写汇编程序或强制编译器进行整数除法,则重复执行10$的整数除法,直到余数为0$或红利为0$。如果是余数,则有一个“$0$”数字。如果是股息,则不存在“$0$”数字。除以除$2$幂以外的数字,无论该数字是什么,都将执行相同的操作数。因此,不再重复$x $ 10美元并测试每一个余下的0美元,考虑反复将$x$除以10美元

检查数字中是否有数字“0”的最快方法是什么

我需要开发一种快速方法,因为我必须在不到20美元的时间内对接近10^9美元的数字执行这些检查


将零转换为字符串后搜索它是否有效?

如果您可以编写汇编程序或强制编译器进行整数除法,则重复执行10$的整数除法,直到余数为0$或红利为0$。如果是余数,则有一个“$0$”数字。如果是股息,则不存在“$0$”数字。

除以除$2$幂以外的数字,无论该数字是什么,都将执行相同的操作数。因此,不再重复$x $ 10美元并测试每一个余下的0美元,考虑反复将$x$除以10美元^ 6美元(例如),并在$1[6 ^ ] $的查找表上对每个剩余部分进行测试。如果剩余部分包含一个内部零点,则查找表应该说“是”,如果“0”不包含零,则“否”,并且“可能”。如果余数只有初始零(在这种情况下,请检查$x$当前是否为非零,并相应地返回“是”或“否”)

我需要开发一种快速的方法,因为我必须在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”。告诉我你的数字,我会给你正确的答案。

二进制零:(~x)如果有零位的话会是非零的。我猜你不关心二进制数

如果您的数据以字符串开头,请保持这种状态。如果不是,请不要转换为字符串,然后进行检查。转换为字符串所做的工作超过了检测零位所需的工作。这可能是特定于语言的。在c或汇编语言中,转换将比您自己的检测算法慢

例如,如果以10为基数的数字存储为整数(如在c中),则可以创建一个包含1000个条目的查找表=0等。然后必须将输入数除以1000,而不是10。余数是查找索引。这可能比除以10快3倍。一个小的查找表可以放入缓存中。表太大,会因为ram太慢而导致性能损失。在c中,无符号整数的分割速度可能比有符号整数快一个,因为优化器可能会采取一些快捷方式


最后,考虑多个线程。

< P>这里有一些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

对于stackoverflow,这可能是一个更好的问题,因为“最快的”方法将取决于数字的存储方式、编译器和CPU的详细信息,等等,这些都不是真正的数学问题。同样重要的是数字有多大;如果数字很小,那么查表就可以很好地工作。或者,您可以对前几位数字使用除以10的算法,然后对数字进行一次运算是小的,请在表中查找。@NateEldredge:或者分块进行,比如说,除以1000。是希望基数为10的表示形式中有0,还是基数为2的表示形式中有0?n保证基数为n的表示形式中有0,因此您可以非常快地检查所有10^9的数字:子程序检查(n)Return truel我要将此问题迁移到stackoverflow。问题下方会显示一个链接,您可以通过该链接找到问题的新位置。如果您需要帮助关联stackoverflow上的帐户,您可以标记您的问题以引起主持人的注意,那边的人会提供帮助。现在我已经发布了帖子d、 我发现这基本上就是Jack Maney提出的算法。除了从查找表中获益匪浅外,这个问题还存在令人尴尬的并行性。尽管不幸的是MMX和SSE都不提供向量整数除法指令,但始终存在并发性。+1用于查找表。除法可能非常昂贵,取决于关于设备架构。10^6美元可能不是最佳选择,您需要将其放入处理器的缓存中。此外,如果您想多次除数,可能值得考虑使用乘法(例如,请参阅)。“但是的,字符串将是最快的。”[需要引用]。将数字转换为字符串,然后检查零(更不用说使用正则表达式)肯定不会是最快的。