大数阶乘
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它?
-
输入
- 输入一个整数m(0<m<=5000) 输出
- 输出m的阶乘,并在输出结束之后输入一个换行符 样例输入
-
50
样例输出
-
30414093201713378043612608166064768844377641568960512000000000000
-
思路,我记得我没有做出来,是看的网上的代码然后会的,其实思路很简单,就是模拟大数乘法,只是这里相乘的时候次数有点多
//nyoj28已A,求解大数阶乘
#include <stdio.h>
#define MAX 50000
int a[MAX];
int main()
{
int n, flag, i, j, len, temp;
scanf("%d", &n);
// int a[MAX];
a[0] = 1;//最开始初始化为1
len = 1;//计数阶乘结果的长度,最开始肯定是1
for(i = 2; i <= n; i++)
{
flag = 0;
for(j = 0; j < len; j++)
{
temp = a[j] * i + flag;//逐位相乘
a[j] = temp % 10;//得出各位结果
flag = temp / 10;//计算进位
}
while(flag != 0)//倘若进位不为0,继续进位
{
a[len] = flag % 10;
flag /= 10;
<span style="white-space:pre"> </span> len++;
}
}
for(i = len - 1; i >= 0; i--)
{
printf("%d", a[i]);
}
printf("\n");
return 0;
}
阶乘因式分解(一)
时间限制:
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
-
第一行是一个整数s(0<s<=100),表示测试数据的组数
#include <stdio.h>
int main()
{
int n, sum, num, m, k, i;
scanf("%d", &n);
while(n--)
{
sum = 0;
scanf("%d%d", &num, &m);
for(i = 1; i <= num; i++)//对要进入阶乘的数逐个遍历
{
k = i;
while(k % m == 0)//判断某个数有没有M的因子
{
k /= m;
sum++;
}
}
printf("%d\n", sum);
}
return 0;
}
阶乘的0
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
计算n!的十进制表示最后有多少个0
-
输入
-
第一行输入一个整数N表示测试数据的组数(1<=N<=100)
每组测试数据占一行,都只有一个整数M(0<=M<=10000000)
输出
-
输出M的阶乘的十进制表示中最后0的个数
比如5!=120则最后的0的个数为1
样例输入
-
6 3 60 100 1024 23456 8735373
样例输出
-
0 14 24 253 5861 2183837
-
第一行输入一个整数N表示测试数据的组数(1<=N<=100)
//nyoj84已A,求解大数阶乘分解质因数的变形
#include <stdio.h>
int main()
{
int n, r, num, sum;
scanf("%d", &n);
while(n--)
{
sum = 0;
scanf("%d", &num);
while(num != 0)
{
num /= 5;
sum += num;
}
printf("%d\n", sum);
}
return 0;
}
借鉴思路:
http://blog.csdn.net/lyhvoyage/article/details/9003429
http://www.cnblogs.com/mycapple/archive/2012/08/09/2629604.html