ILSMATH2 - Đếm số giai thừa 2!

Tác giả: hieult

Ngôn ngữ: C++

#include <stdio.h>
//#include <conio.h>
#include <math.h>
#define Pi  3.14159265
#define e  2.71828183

double u,v,m,r;
int so;

void luythua(int k)
{
     if(k==1)
     {
          u = v;
     }
     else if(k%2==0)
     {
          luythua(k/2);
          u = u*u;
          so = so*2;
     }
     else
     {
          luythua (k/2);
          u = u*u*v;
          so = so*2;
     }
     while(u>10)
     {
         u=u/10;
         so++;
     }      
}

int f(int x)
{
    m = sqrt(2*Pi*x);
    v = (x/e);
    so = 0;
    luythua(x);
    u = u*m;
    while(u>10)
     {
         u=u/10;
         so++;
     } 
    return so+1;   
}

int main()
{
    int n;
    double Q=1;
    int t=0,a[4];
    //while(scanf("%d",&n)>0)
        //printf("%d\n",f(n));
    scanf("%d",&n);
    if(n<100000)
    {
    for(int i = 1;;i++)
    {
        Q = Q*i;    
        while(Q>=1)
        {
            Q = Q/10;
            n--;
        }
        if(Q<1 && n==0)
        {
            t++;
            a[t] = i;
        }
        if(n<0)
             break;
    }
    if(t==0)
        printf("NO");
    else
    {
        printf("%d\n",t);
        for(int i = 1;i<=t;i++)
            printf("%d\n",a[i]);
    }
    }
    else
    {
        int U = 1,V=n;
        while(V-U>1)
        {
            int r = (U+V)/2;
            if(f(r)>n)
                V = r;
            else U = r;
        }
        if(f(U)!=n)
        {
             printf("NO");
             //printf("%d",u);
        }
        else
        {
            printf("1\n");
            printf("%d",U);
        }
    }
    //getch();
}
    

Download