问题描述:
cds:听说你已经会用C语言求n!了
ykc:那当然!轻院oj所有有关阶乘的题我早就已经全部AC了,例如1048阶乘表,1050阶乘的累加和,1089阶乘的最高位等等……
cds:哦?是么,那我给你一个数n,你能立刻求出它的阶乘么?
ykc:好,没问题!
cds:可n很大哦
ykc:没事,我用long long就好
cds:那好,n=80
ykc:&#¥%#woc
输入:
单实例测试,输入一个自然数n(n<=2000)
输出:
输出n的阶乘
样例输入:
80
样例输出:
71569457046263802294811533723186532165584657342365752577109445058227039255480148842668944867280814080000000000000000000
原因分析:
1. 利用i 来实现 1到n的阶乘 ,temp 记录每次相乘得到的数 ,digit记录位数(使每位数都能相乘)
2. temp=a[j]*i+num; num是某位相乘后进的位上的数(num=temp/10;)该进的位上的数 * i后,需要加上低位上进的num.
3.把num/10 比如 4的阶乘 最后是 4*(2*3),即24,此时num=2 要存到 digit 也就是1的位置上
另建一个while是算到后面会出现 num是好几位,所以用个循环都存下每位.
解决方案:
#include <stdio.h>
int main()
{
int a[20001];//储存每一位所得到的数
int temp,digit,n,i,j=0;//temp每次的得数 digit每次得数的位数
scanf("%d",&n);
a[0]=1;//从1开始乘
digit=1;//位数从第一位开始
for(i=2;i<=n;i++)
{
int num=0;
for(j=0;j<digit;j++) //for的目的:将一个数的每一位数都分别乘以i,
{
temp=a[j]*i+num;
a[j]=temp%10; //将一个数的每一位数利用数组进行储存
num=temp/10;
}
while(num)
{
a[digit]=num%10; //继续储存最后一次的进位后的数
//之前的进位都在第二个for里储存了
num=num/10;
digit++;
}
}
for(i=digit-1;i>=0;i--)//倒序输出每一位
printf("%d",a[i]);
printf("\n");
return 0;
}
多实例输入:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main()
{
ll i,j,n;
while(cin>>n)
{
ll digit=1,a[100000]; //a数组,a[0]=1,digit需要放进来.
a[0]=1;
for(j=2;j<=n;j++)
{
ll num=0,temp;
for(i=0;i<digit;i++)
{
temp=a[i]*j+num;
a[i]=temp%10;
num=temp/10;
}
while(num)
{
a[digit]=num%10;
num/=10;
digit++;
}
}
for(i=digit-1;i>=0;i--)
printf("%d",a[i]);
printf("\n");
}
}