阶乘分解质因数

对    进行质因子分解。

input

12

output

2 10
3 5
5 2
7 1
11 1

思路

首先知道一个简单数怎样分解质因数: 遇到一个质因子时便将其除尽

for(int i = 2; i <= x / i; i++)
{
	if(x % i == 0)
	{
		int cnt = 0;
		while(x % i == 0)
		{
			x/=i;
			cnt++;
		}
		cout << i << "^" << cnt;
	}
}

对于阶乘这个大整数不能通过算出阶乘然后分解质因数来解。 那就只能枚举中所有质数 p, 并求出对应的指数 k 对于的质因子 p 的指数 我们来一个样例说明一下:

1  2  3  4  5  6  7  8         我们求得在 8!中 2 的个数

1      1      1      1         首先我们先计算出 2 的倍数的个数:8/2=4

1              1         其次我们计算出 4 的倍数的个数:    8/4=2(上面一个式子求出了第一层,现在求第二层)

1         最后我们解出第三层的 2 的个数:    8/8=1

我们把 4+2+1=7,所以一共 7 个 2 出现了。

即:

到这里我们可以发现:我们平时求的方法是一列一列求的(就是每一个数算一遍),而这个方法我们每一行每一行的求,虽然效果一样,但求起来速度很快。值得学习。

故做法:

1.先把素数表打好

2.for 循环把小于 n 的每个质数进行一次运算,用数组记录

3.结束

非常快。

int main()
{
    int n;
    cin >> n;
    for (int i = 2; i <= n; i++)
    {
        bool isprime = true;
        for (int j = 2; j <= i / j; j++)
            if (i % j == 0)
            {
                isprime = false;
                break;
            }
        if (isprime)
        {
            int cnt = 0;
            for (int k = i; k <= n; k *= i)
                cnt += n / k;
            cout << i << " " << cnt << endl;
        }
    }
    return 0;
}