c# - 素数分解如何保证因子是素数?
问题描述
在这个特定的代码中,它如何不输出 6 1,因为 6 除以 18 没有余数。
int n = 18;
int[] fact = new int[100];
int[] pow = new int[100];
int d = 0;
for (int i = 2; i <= n; i++)
{
int s = 0;
while(n % i == 0)
{
s++;
n /= i;
}
if (s > 0)
{
fact[d] = i;
pow[d] = s;
d++;
}
}
解决方案
每个数字要么是素数,要么是素数的倍数。看:https ://en.wikipedia.org/wiki/Sieve_of_Eratosthenes
如果它不能被一个素数整除,它也不能被那个素数的任何倍数整除。因为 18 可以除以 2 - 4, 6, 8, 10,而其他一切都不需要测试。由于 19 不能除以 2、4、6、8 和 10 永远不需要测试。20 可以被 10 整除,永远不需要测试。它已经除以 2,所以我们当时排除了一半可能的数字。
我们本能地排除除数,但通常只针对 2 - 仅测试奇数 - 但您可以更进一步。由于除法的结果也必须是素数或素数的倍数,我们甚至可以在通过平方根后停止。
你真正需要的是一个完整的素数列表,直到素数> Squarroot(PrimeCandidate)。没有从记忆中阅读它,这是我知道的最快的方法。
实际上,我不久前就该主题写了一些东西,关于检查素数的 5 种方法:https ://social.msdn.microsoft.com/Forums/en-US/85fc2406-d2e9-495a-bea7-e516661f8b40 /primal-issues-multithreading-lists-in-memory-and-checking-for-prime-number?forum=csharpgeneral
推荐阅读
- javascript - 如何在 php 端回显来自 javascript 的发布数据以进行开发?
- python - 用于文档的 Python 接口
- java - 如何退出 switch 语句并返回到 While 循环?
- node.js - 异步功能适用于 Postman,但在测试时不适用
- c++ - 为什么 COM 指针参数转换为 void 而不是 IUnknown?
- javascript - 使用dottie js访问数组中的元素(使用索引)
- scala - 如何在 Scala 测试中检查“任一”结果?
- excel - 如何在单击弹出菜单(右键单击)上的“删除”之前获取值?
- repast-simphony - 是否可以使用服务器启动器可视化显示?
- delphi - 可以访问对象属性的Delphi 7 TListSortCompare