单身狗进化——求n!的位数



题目:



分析:

这道题目要求的是n!的位数,显然一种思路是先求出n!的值,假定为res,然后再计算res的位数,这种方法在n比较小时是可以的,如果res为int型,一旦n>16,res就会超出int范围,如果为double型,当n>170时也会出错,而此题的n最大可以为25000,显然没办法先求出res。当然,如果通过数组去模拟,也是可以的,但是对于此题来说太过麻烦,所以换种思路来做。如果是要求n!的值,那就只能通过数组去模拟了,但是我们现在只要求n!的位数即可,那么就可以边算阶乘,边算位数。我们都知道,要计算一个数的位数,只要把这个数一直除以10,用一个计数器就可以了。这里也一样,可以把每一次res都除以10,直到它比10小为止,每除一次,就把计数器加一。由于res的最后几位小数在double范围内并不会对位数造成影响,所以此法可行。



代码:

#include<iostream>
using namespace std; 

int main()
{
    int n,i;
    double res=1;
    int count=1;

    cin>>n;

    for(i=2;i<=n;i++)
    {
	    res*=i;                   //计算阶乘
	
	    while(res>=10)            //计算位数
	    {
		    res/=10;
		    count++;
	    }
    }

    cout<<count<<endl;

    return 0;
}


原文地址:https://www.cnblogs.com/jiuweilinghu/p/5929408.html