hdu 1042 N!问题

本文深入探讨了高性能计算和大数据处理领域的关键技术,包括并行计算、分布式存储、云计算平台等,旨在提升数据处理效率与分析能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

N!

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 54233    Accepted Submission(s): 15395


Problem Description
Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N!
 

Input
One N in one line, process to the end of file.
 

Output
For each N, output N! in one line.
 

Sample Input
1 2 3
 

Sample Output
1 2 6
 思路:这道题就是按照数学思想来写的,只不过具体化为以位为单位。
代码:
第一种:
//这种方法比较费时,后有优化的;
#include<stdio.h>
#include<string.h>
#define M 50000
int a[M];
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
                          int i,j,c;
                          memset(a,0,sizeof(a));
                          if(n==0)
                          {
                                  printf("1\n");
                                  continue;
                          }
                          c=0;
                          a[1]=1;
                          for(i=1;i<=n;i++)
                          {
                                           for(j=1;j<M;j++)
                                           {
                                                           a[j]=a[j]*i+c;
                                                           c=a[j]/10;
                                                           a[j]=a[j]%10;
                                           }
                          }
                          for(i=M;a[i]==0;i--);
                          for(;i>=1;i--)
                          printf("%d",a[i]);
                          printf("\n");
    }
    return 0;
}
第二种:
#include<stdio.h>
#include<string.h>
#define M 50000
int a[M];
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
                          int i,j,c,k;
                          memset(a,0,sizeof(a));
                          if(n==0)
                          {
                                  printf("1\n");
                                  continue;
                          }
                          int bit=1;
                          a[0]=1;
                          c=0;
                          for(i=1;i<=n;i++)
                          {
                                    for(j=0;j<bit;j++)
                                    {
                                                       a[j]=a[j]*i+c;
                                                       c=a[j]/10;
                                                       a[j]=a[j]%10;
                                    }
                                    while(c)
                                    {
                                            a[bit]+=c%10;
                                            c=c/10;
                                            bit++;
                                    }//区别主要在这:这个是当有必要进位时才进位,前者则不是;
                          }
                          for(i=bit;a[i]==0;i--);
                          for(;i>=0;i--)
                          {
                                       printf("%d",a[i]);
                          }
                          printf("\n");
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值