- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
这个问题在这里已经有了答案:
Algorithm to find all the exact divisors of a given integer
(7 个回答)
8年前关闭。
我已经编写了这段代码,但它花费了大量时间来计算......
你能帮我找出一种有效的方法吗?
int tag;
int* factors(int n)
{
int a[1000000];
for(int i=1;i<=n/2;i++)
if(n%i==0)
a[++tag]=i;
a[++tag]=n;
return(a);
}
最佳答案
到目前为止,还没有人想出一种比 快 的算法。这并不一定意味着没有,因为另一方面,也没有证明不可能更快地做到这一点。
您可能想要考虑的一种优化是,没有必要搜索最多 n/2,您可以在达到 sqrt (n) 时停止。
...如果您真的想返回“克里斯”评论中已经提到的所有候选人的列表,请务必为您的号码选择不同的存储位置。
编辑:
正如我被告知有相当多的算法可用,就时间复杂度而言,它们的运行速度可能比您询问的算法快一点,可能会指示添加比上面给出的简短评论更多的单词。
除了最明显的可能性之外,在首先将循环划分为奇数之后,只需以 2 步运行循环来保护一些计算时间,还有一些其他技巧可用,但我没有提到它们作为 实质上 在答案中更快上面给出。
导致这个决定的主要原因是,例如,虽然将迭代次数减少 2 倍,与运行时的预期增长相比似乎是一个巨大的胜利,但随着数字的增长,增加了一个衡量的 yield 常数变得如此之小,以至于在复杂性理论中甚至根本不会产生任何区别,并且可以说两种算法具有(几乎)相同的时间复杂度。
即使有可能获得 常数 的原始算法运行时间数千亿倍的增益,它们之间仍然不会有任何区别。
数字越大,任何常数的影响就越小,如果它也随着您要处理的数字的大小而迅速增长,那么它就与您在运行时方面所能想象的一样大。
在时间复杂度方面的一个非常特殊的障碍通常被认为是实际可行和完全不可能之间的边界,就是所谓的 polynomial
运行时。
这意味着即使运行时可能会随着 n
的增长而急剧增长,但仍然可以用 常数 指数 k
来描述这种增长,这样运行时就是围绕 n^k
的东西。
另一方面,没有 polynomial
运行时的算法不能用任何指数来衡量,你可能想要它有多大。
为了举例说明为什么这种差异可能真的很重要,让我们看一下两个虚构的算法。第一个具有多项式运行时,例如 n^10
,而另一个则使用运行时 n!
说这个。
虽然它对于小数似乎并不坏,但假设 n 只是 10,这里算法第一个采用 10^10 = 10000000000
时间单位,而只有 3628800
单位,我们的第二个算法似乎运行得更快。
我们的算法二的问题是,与算法一相比,它的运行时间会增长得更快。在 n=100
你会得到类似的东西:算法一的 100000000000000000000
而它已经是算法二的 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
。
使用 n=1000
进一步插入前沿,我们最终得到:算法一在 1000000000000000000000000000000
而我们的第二个算法将采用类似 402387260077093773543702433923003985719374864210714632543799910429938512398629020592044208486969404800479988610197196058631666872994808558901323829669944590997424504087073759918823627727188732519779505950995276120874975462497043601418278094646496291056393887437886487337119181045825783647849977012476632889835955735432513185323958463075557409114262417474349347553428646576611667797396668820291207379143853719588249808126867838374559731746136085379534524221586593201928090878297308431392844403281231558611036976801357304216168747609675871348312025478589320767169132448426236131412508780208000261683151027341827977704784635868170164365024153691398281264810213092761244896359928705114964975419909342221566832572080821333186116811553615836546984046708975602900950537616475847728421889679646244945160765353408198901385442487984959953319101723355556602139450399736280750137837615307127761926849034352625200015888535147331611702103968175921510907788019393178114194545257223865541461062892187960223838971476088506276862967146674697562911234082439208160153780889893964518263243671616762179168909779911903754031274622289988005195444414282012187361745992642956581746628302955570299024324153181617210465832036786906117260158783520751516284225540265170483304226143974286933061690897968482590125458327168226458066526769958652682272807075781391858178889652208164348344825993266043367660176999612831860788386150279465955131156552036093988180612138558600301435694527224206344631797460594682573103790084024432438465657245014402821885252470935190620929023136493273497565513958720559654228749774011413346962715422845862377387538230483865688976461927383814900140767310446640259899490222221765904339901886018566526485061799702356193897017860040811889729918311021171229845901641921068884387121855646124960798722908519296819372388642614839657382291123125024186649353143970137428531926649875337218940694281434118520158014123344828015051399694290153483077644569099073152433278288269864602789864321139083506217095002597389863554277196742822248757586765752344220207573630569498825087968928162753848863396909959826280956121450994871701244516461260379029309120889086942028510640182154399457156805941872748998094254742173582401063677404595741785160829230135358081840096996372524230560855903700624271243416909004153690105933983835777939410970027753472000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
的东西。
不信你自己算算。 bc
手册甚至包含如何实现阶乘函数的示例。
但是在数数时不要头晕……
即使我们以普朗克时间为单位进行测量,知道我们必须在 10 上添加多少个尾随零才能得到乘以我们的宇宙年龄以获得如此大的时间跨度的因子可能会很有趣。不幸的是我不知道。
有趣的是,直到今天,还没有任何已知的算法可以在 polynomial
时间执行因式分解。
由于它本身不仅是一个有趣的研究领域, 实用的 不可能分解大整数也在当今广泛使用的 RSA 公钥加密算法中发挥着重要作用,因此几乎自然而然地已经有很多在这方面的研究。
发现算法(不打破已经提到的障碍)运行 比您想象的算法快 。
由于“Jim Balter”已经在他的评论中正确注释,您可能需要查看引用文章(请参阅: http://en.wikipedia.org/wiki/Integer_factorization#General-purpose )以了解其他人已经提出的方法。
“Jim”也提到的这篇文章可能是另一个有趣的资源:(参见:What is the fastest factorization algorithm?)
另一个值得查看的有趣链接可能是过去几年 RSA 因式分解挑战获胜者的名单,以某种方式了解今天可行和几乎不可能之间的界限在哪里。 ( http://en.wikipedia.org/wiki/RSA_Factoring_Challenge )
关于c - 计算整数的所有因子的最快算法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15697166/
我正在尝试学习 Fortran,并且看到了很多不同的定义,我想知道他们是否正在尝试完成同样的事情。以下有什么区别? 整数*4 整数(4) 整数(kind=4) 最佳答案 在 Fortran >=90
我以前从未编程过,最近(1 周前)才开始学习!第一门类(class)是函数式编程,使用 Haskell。 我有一项学校作业,我想通过删除一两个步骤来改进它,但我遇到了一个讨厌的错误。 基本上,我创建了
给定以下GraphQL请求和变量: 请求: query accounts($filter:AccountFilter, $first_:String, $skip_:Int) { accounts
我已经搜索了 StackOverflow,但找不到关于如何检查计算器应用程序的数字输入正则表达式的答案,该计算器应用程序将检查每个 keyup 的以下格式(jquery key up): 任何整数,例
类似于我上一篇致歉的文章,但没有那么长篇大论。基本上我想知道当每次重绘调用只重绘屏幕的一小部分时,优化重绘到 JFrame/JPanel 的最佳选择是什么。 此外,除了重绘重载之外,我并不是 100%
所以在我的教科书中有一个使用 f# 的递归函数的例子 let rec gcd = function | (0,n) -> n | (m,n) -> gcd(n % m,m);; 使用此功能,我的教科书
我有一个数据结构,例如表达式树或图形。我想添加一些“测量”功能,例如depth和 size . 如何最好地键入这些函数? 我认为以下三个变体的用处大致相同: depth :: Expr -> Int
这样写比较好 int primitive1 = 3, primitive2 = 4; Integer a = new Integer(primitive1); Integer b = new Inte
我是 Java 8 新手,想根据键对 Map 进行排序,然后在值内对每个列表进行排序。 我试图寻找一种 Java 8 方法来对键和值进行排序。HashMap>映射 map.entrySet().str
这就是我的目标... vector ,int> > var_name (x, pair (y),int>); 其中 x 是 vector var_name 的大小,y 是对内 vector 的大小。
这里是 an answer to "How do I instantiate a Queue object in java?" , Queue is an interface. You can't i
这个问题在这里已经有了答案: Weird Integer boxing in Java (12 个答案) Why are autoboxed Integers and .getClass() val
我们可以使用 C++ STL 做这样的事情吗?如果是,我将如何初始化元素?我试图这样做,但没有成功。 pair,vector>p; p.first[0]=2; 最佳答案 Can we do som
您好,我正在尝试为百分比和整数数组中的数字找到索引。假设 arraynum = ['10%','250','20%','500'] 并且用户发送一个值 15%,这个数字在哪个范围内居住?我可以使用这段
我与三列有关系:ProductName、CategoryID 和 Price。我需要选择仅那些价格高于给定类别中平均产品价格的产品。(例如,当apple(ProductName)是fruit(Cate
我已经坚持了一段时间,我正在尝试将一些数据配对在一起。这是我的代码。 #include #include using namespace std; int main() { pair data(
我收到错误:'(Int, Int)' 与 'CGPoint' 不相同 如何将 (Int, Int) 转换为 CGPoint let zigzag = [(100,100), (100,150)
我在 .cpp 文件中发现了以下代码。我不理解涉及头文件的构造或语法。我确实认识到这些特定的头文件与 Android NDK 相关。但是,我认为这个问题是关于 C++ 语法的一般问题。这些在某种程度上
我将这些输入到 Scala 解释器中: val a : Integer = 1; val b : Integer = a + 1; 我收到消息: :5: error: type mismatch;
C++:vector>v(size);当我试图打印出值时显示 0 作为值,但是当未声明 vector 大小时它显示正确的输出?为什么这样?例如: int x; cin>>x; vector>v(x);
我是一名优秀的程序员,十分优秀!