C++ 大量数的素因子分解
所以我必须对从1到8*10^6的10^6个不同的数字进行素数分解。我用埃拉霍斯特内斯的筛子做过,但似乎太慢了。我不知道该怎么办。这是我的密码:C++ 大量数的素因子分解,c++,prime-factoring,C++,Prime Factoring,所以我必须对从1到8*10^6的10^6个不同的数字进行素数分解。我用埃拉霍斯特内斯的筛子做过,但似乎太慢了。我不知道该怎么办。这是我的密码: int factors[8000001] = { }; void sieve(int* tab, int max) { for (int i = 2; i * i < max; ++i) { if(tab[i] == 0) { for (int j = i; j * i &l
int factors[8000001] = { };
void sieve(int* tab, int max)
{
for (int i = 2; i * i < max; ++i)
{
if(tab[i] == 0)
{
for (int j = i; j * i < max; ++j)
{
if (tab[i*j] > i || tab[i*j] == 0)
tab[i*j] = i;
}
}
}
}
int因子[8000001]={};
空隙筛(int*选项卡,int max)
{
对于(int i=2;i*ii | | tab[i*j]==0)
tab[i*j]=i;
}
}
}
}
在main()中:
cin>>编号;
而(数量>1)
{
如果(系数[数字]==0)
{
tab和factors[]一样吗?还有,你没有整数溢出吗?是的,tab等于factors(更具体地说,它是一个指向factors的指针),我将它传递给siever()函数。我几乎可以肯定没有intiger溢出,所有的数字都小于8*10^6,intiger最多为2147483647。编辑:factors[]是否在全局范围内?是否必须按递增顺序打印因子?如果不是,则可以删除sieve()中的If条件。不幸的是,必须按递增顺序打印,每个因子后的星号也很重要:/
cin >> number;
while (number > 1)
{
if (factors[number] == 0)
{
cout << number;
number = 1;
}
else if (number != factors[number])
cout << factors[number] << "*";
else
cout << factors[number];
number /= factors[number];
}
cout << "\n";