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

8 篇文章 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 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");

    }

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值