在primes
之后,我已将所有素数存储在向量sieve
中的范围内。现在我想在短时间内找到n
的所有主要因素。
我的代码:
i=0
while(primes[i]<=n)
{
if(n%primes[i]==0)
{
cout<<primes[i]<<endl;
}
while(n%primes[i]==0)
n/=primes[i];
i++;
}
但这不高效,请建议任何可能的修改。 谢谢!
答案 0 :(得分:1)
我认为这应该更有效率,因为我消除了代码中的其他循环。我在C#中进行了测试,除了我用硬编码测试它。
我认为这是您想要看到的代码。希望它更有效率。我用C#编写它并没有素数列表所以我硬编码(或者足够我的例子)
我认为代码将基于您的代码
i = 0
while(n > 1)
{
if(n % primes[i] == 0)
{
cout<<primes[i]<<endl;
n /= primes[i];
}
else
i++;
}
我在C#编写的代码,我认为模仿你的代码或者至少我认为你在做什么。
int n = 1806046;
int[] primes;
primes = new int[] { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 439, 601, 733, 941, 1151 };
int i = 0;
while (n > 1)
{
if (n % primes[i] == 0)
{
comboBox1.Items.Add(primes[i]);
n /= primes[i];
}
else
i++;
}
这是我测试过的代码,并以C#为基础。哪个工作得很好并且迭代了所有数字而不仅仅是素数。
int x = 1806046;
int i = 2;
while (x > 1)
{
if (x % i++ == 0)
{
x /= --i;
}
}
答案 1 :(得分:1)
您正在检查n
以前的所有素数。你不需要这样做。一旦你删除了所有因素,并且包括sqrt(n)
,那么剩下的未被证实的部分本身就是素数或者是1。
您可以在n == 1
时退出外循环,因为找不到更多素因子。想想像16这样的数字,有许多小的素因子。
每次通过外循环进入内循环。你不需要这样做;当if
为真时,你只需要内循环。
进入if
后,您可以通过将while
循环更改为do
循环来保存重复模数计算。
i = 0;
// Find prime factors up to square root.
limit = sqrt(n);
while ((primes[i] <= limit) && (n > 1))
{
if (n % primes[i] == 0)
{
cout << primes[i] << endl;
do
{
n /= primes[i];
} while (n % primes[i] == 0);
}
i++;
}
// Find possible factor above square root.
if (n > 1)
{
cout << n << endl;
}
我没有对代码进行测试,所以最好自己测试一下。
答案 2 :(得分:0)