当前位置: 代码迷 >> 综合 >> HAUT OJ 1245: cds的大大大阶乘---高精度阶乘
  详细解决方案

HAUT OJ 1245: cds的大大大阶乘---高精度阶乘

热度:95   发布时间:2023-12-04 03:25:02.0

问题描述:

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");}}