问题描述:
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 longint 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");}}