阶乘因式分解(一)

阶乘因式分解(一)

时间限制:3000 ms  |  内存限制:65535 KB
难度:2
描述

给定两个数m,n,其中m是一个素数。

将n(0<=n<=10000)的阶乘分解质因数,求其中有多少个m。

输入
第一行是一个整数s(0<s<=100),表示测试数据的组数
随后的s行, 每行有两个整数n,m。
输出
输出m的个数。
样例输入
2
100 5
16 2
样例输出
24
15
来源
网络
上传者

苗栋栋


此题不能按照正常的直接求阶乘然后计算,而应该分开计算。

比如16中2的倍数为16 14 12 10 8 6 4 2就这8个,他们在阶乘中表示为16*14*12*10*8*6*4*2

第一次:当每个中提取出来一个2时,为8*7*6*5*4*3*2*1

为什么这样弄呢,我们可以这样想,16/2=8,所以说这个8是第一次提取分开2时的最大的数,并且第一次得有16/2=8个2的倍数

第二次:只有8*6*4*2中为2的倍数,此时再提取2得4*3*2*1

即为8/2=4,因为第一次剩下的2得倍数中8是最大的,所以再次提取2时,8/2=4的4是第二次中最大的2的倍数,并且第二次得有8/2=4个2的倍数

第三次:只有4*2为2的倍数,此时再次提取2得2*1

即为4/2=2,道理同上

第四次:只有1,此时结束,我们可以看做第四次时剩下的2/2=1,1为此时最大的,但1/2=0,所以不可能有接下来的。

最关键为:每次除以2都是下一次的倍数的最大值

关键代码:

while(n)
		{
		
			if(n/m!=0)
			count+=(n/m);
			n=(n/m);
		}
完整代码
#include<stdio.h>
int main()
{
	int q,n,m;
	scanf("%d", &q);
	while(q--)
	{
		int count=0;
		scanf("%d", &n);
		scanf("%d", &m);
		while(n)
		{
		
			if(n/m!=0)
			count+=(n/m);
			n=(n/m);
		}
		printf("%d\n", count);
	}
	return 0;
 } 
#include<iostream>//最优程序
using namespace std;
int get(int n,int num)
{
    if(n==0) return 0;
    else return get(n/num,num)+n/num;
}
int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        int a,b;
        cin>>a>>b;
        cout<<get(a,b)<<endl;
    }
}        
最优程序我表示还没看懂

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页