杭电OJ(HDOJ)1018题:求n的阶乘位数(数学公式)

题意:

先输入一个整数n,表示有n个测试案例,接下来第输入一个数a(1<=a<=10000000),求a的阶乘位数,并输出。

错误解决方案:

采用大数方法进行解决,但a的输入范围太大,使用大数会超时,代码:

#include<iostream>
#define N 1000
using namespace std;

//大数计算函数
void calculate(int arr[],int t)
{
    int i;
    int c=0;
    int temp;
    for(i=0; i<N; i++)
    {
        temp=arr[i];
        arr[i]=(arr[i]*t+c)%10;
        c=(temp*t+c)/10;
    }
}

int main()
{
    int n,count,t,i;
    int arr[N] = {0};
    arr[0]=1;
    cin>>n;
    while(n--)
    {
        cin>>t;
        for(i=1; i<=t; i++)
        {
            calculate(arr,i);
        }
        for(i=N-1; i>=0; i--)
        {
            if(arr[i]) break;
        }
        cout<<i+1<<endl;
        //数组再次归零
        for(i=1;i<N;i++)
            arr[i]=0;
        arr[0]=1;
    }

}

正确的解决方案:

整数a的位数为:(int)log10 (a) +1

对于任意一个给定的正整数a,假设存在正整数x,使得10^(x-1)<=a<10^x,那么显然a的位数为x位,又因为log10(10^(x-1))<=log10(a)<(log10(10^x)), 即x-1<=log10(a)<x,则(int)log10(a)=x-1,可化为(int)log10(a)+1=x,最后得到a的位数是(int)log10(a)+1

已知n!=1*2*3*4*········*n,log10(n!)=log10(1*2*3*4*········*n) =log10(1)+log10(2)+log10(3)+log10(4)·······+log10(n)

求得n!的位数为:(int)(log10(1)+log10(2)+log10(3)+......+log10(n)) + 1

#include<iostream>
#include<math.h>
using namespace std;

int main()
{
    int n,t,i;
    double s;
    cin>>n;
    while(n--)
    {
        cin>>t;
        s=0;
        for(i=1; i<=t; i++)
        {
            s+=log10((double)i);
        }
       cout<<(int)s+1<<endl;
    }

}


你可能感兴趣的:(ACM,N,OJ)