Algorithm 如果我可以在多达10^6次的计算中完成这项任务,那么如何获得10^18范围内的所有因子,即除数?
我在获取一个数的所有因子时遇到了一些问题,我已经尝试了这段代码,但这给了我在竞争性编程问题上的一些技巧Algorithm 如果我可以在多达10^6次的计算中完成这项任务,那么如何获得10^18范围内的所有因子,即除数?,algorithm,math,numbers,Algorithm,Math,Numbers,我在获取一个数的所有因子时遇到了一些问题,我已经尝试了这段代码,但这给了我在竞争性编程问题上的一些技巧 for i in range(1,int(N**0.5)+1): if N%i==0: S.add(i) S.add(N//i) 我想用筛子来获取所有因素。我不想只找到计数,而是在列表中实际访问它们!我希望有人能向我解释如何在其中使用Erasethosense的Sieve除非你需要在小范围内计算许多数字的除数,否则Sieve不是这样做的方法。要找到一个数的除数,请将其因子化,
for i in range(1,int(N**0.5)+1):
if N%i==0:
S.add(i)
S.add(N//i)
我想用筛子来获取所有因素。我不想只找到计数,而是在列表中实际访问它们!我希望有人能向我解释如何在其中使用Erasethosense的Sieve除非你需要在小范围内计算许多数字的除数,否则Sieve不是这样做的方法。要找到一个数的除数,请将其因子化,然后计算除数。这是Python的版本:
def divisors(n):
fs = factors(n)
divs = [1]
for f in fs:
temp = divs[:]
for d in divs:
if f * d not in temp:
temp.append(f*d)
divs = temp
return sorted(divs)
在我的电脑中,它运行得非常快,它会给你所有的因素,但它是Java的,如果这有帮助的话
public class Factoring
{
private static Set<Long> findFactors(long num)
{
Set<Long> nn = new HashSet<>();
for (long i = 2; i <= Math.sqrt(num); i++)
if (num % i == 0)
{
nn.add(i);
nn.add(num / i);
}
return nn;
}
public static void main(String[] args)
{
Set<Long> myTreeSet = new TreeSet<>(findFactors(10050000911364137L));
System.out.println(myTreeSet);
}
}
-有了动画,当“X”除以“Y”时,除了重新计算之外,你可以使用“X”的所有因子的结果到“Y”。@zmb我认为wiki已经帮了我很多,所以我选择在这里写一个问题:)@ManojBanik如果你能为它写一个代码,那将是一个很大的帮助:(因为我在理解这么大的数字时遇到了一些问题,即使是一个位集,您仍然需要很多TB的ram,更不用说时间复杂性了……实际上,根据这个问题,我真的想对一系列数字使用除数,然后访问它们:)这里的因子是指素因子?是的,我指的是素因子。在任何合理的时间内,你都不会筛选到10**18。所以所有的工作都是通过
因子(n)完成的
如果n
是大小为10^18的素数,则最有可能需要10^6次以上的运算。对大小为10**18的复合数进行因子分解不需要10^6次运算。只有当您将自己限制在试验除法时才是如此,这非常缓慢。其他因子分解算法要快得多。“TreeSet”允许您对所有因子进行排序,如果您不需要对它们进行排序,您可以使用Set,这将比这个稍快。您还可以缓存sqrt结果。int sqrt=(int)Math.round(Math.sqrt(num));
和i表示素数(~10^18)这个算法需要10^9运算,这超出了问题的10^6限制。@vivek_23我在编译时知道Java缓存该值,不是吗?问题并没有要求“非常快”,它要求的解决方案需要少于10**6个步骤。这更像是10**9个步骤。我不知道为什么问题中给出了10**6,但它就是这么说的。
[5233, 131627, 14590507, 688804091, 76352123131, 1920504664889]