怎样求任意一个数的位数问题

来源:互联网 发布:算法设计 编辑:程序博客网 时间:2024/05/18 18:47

对于一般要求不高的程序代码如下:

#include < iostream >
using namespace std;
int main()
{
   __int64 n;
  while(scanf("%I64d",&n)==1)
   {
    intcount=0;
     while(n)
   {
     n/=10;
   count++;
   }
  cout<<count<<endl;
   }
}

 

然而在做oj是一般对时间的要求很高,故可以优化算法:

因为对于任意的整数n,可以知道它的位数m=(int)lg(n)+1;可以自己证明);

#include < iostream >
#include < cmath >
using namespace std;
int main()
{
   __int64 n;
  while(scanf("%I64d",&n)==1)
   {
    intm=(int)log10(n);
   cout<<m+1<<endl;
   }
   return 0;
}

 

如果是求一个数阶乘呢?用第一种方法?不行不行,数据太大会溢出,就可以考虑用上面第二种方法!

设A=n!

则log10A=log(1*2*3*.......*(n-1)*n)+1;

              =log10(1)+log10(2)+log10(3)+……+log10(n-1)+log10(n)+1;

这个问题就得到很好的解决了!

 

思考,如果输入的数超级大,超过了__int64的范围该如何解决?

嗯,用字符串嘿嘿!

1 0
原创粉丝点击