游客 Signup | Login
中文 | En

2332 - 高精度阶乘的和

用高精度计算出S=1!+2!+3!++N!N50),其中"!"表示阶乘,例如:5!=5*4*3*2*1

输入正整数N,输出计算结果S。


Input

每个测试文件只包含一组测试数据,每组输入一个正整数N。


Output

对于每组输入数据,输出阶乘和的计算结果。


Examples

Input

3

Output

9

Solution C

#include <stdio.h>
#include<string.h>
int jinwei(int *a,int l)
{
    int i,flat=0;
    for(i=0;i<l;i++)
   {
        if(a[i]>=10)
    {
        a[i+1]+=a[i]/10;
        a[i]%=10;
    }
    if(a[i]) flat=i;
   }
   return flat;
}
int sum(int *a,int *b)
{
    int i;
    for(i=0;i<70;i++)
    a[i]+=b[i];
    int l=jinwei(a,100);
    return l;
}
void jiecheng(int *b,int n)
{
     int  j,w;
       b[0]=1;
    for(w=n;w>1;w--)
       {
            for(j=0;j<70;j++)
            b[j]*=w;
            jinwei(b,70);
       }
}
int main()
{
    int a[100],b[70],n;
   scanf("%d",&n);
   {
        memset(a,0,sizeof(a));
{
    int i;
    for(;n>=1;n--)
    {
        memset(b,0,sizeof(b));
        jiecheng(b,n);
       i=sum(a,b);
    }
        for(;i>=0;i--)
        printf("%d",a[i]);
        printf("\n");
}
   }


    return 0;
}

Solution C++

#include<stdio.h>
#include<string.h> 
int f[4000],b[4000];
int main()
{
    int i,j,n;
    while(scanf("%d",&n)!=EOF)
    {
        memset(f,0,sizeof(f));
		memset(b,0,sizeof(b));
        f[0]=1,b[0]=1;
        for(i=2;i<=n;i++)
        {
            int c=0;
            for(j=0;j<4000;j++)
            {
                int s=f[j]*i+c;
                f[j]=s%10;
                c=s/10;
            }
			for(j=0;j<4000;j++)
			{
				if(b[j]+f[j]>9)
				{
					b[j]=b[j]+f[j]-10;
					b[j+1]++;
				}
				else
					b[j]=b[j]+f[j];
			}
        } 
        for(j=3999;j>=0;j--) 
           if(b[j]) break;
        for(i=j;i>=0;i--)  printf("%d",b[i]);
        printf("\n");   
    }    
    return 0;
}   
Time Limit 1 second
Memory Limit 125 MB
Discuss Stats
上一题 下一题