您的位置:首页 > 其它

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

2017-03-22 20:50 204 查看
对于一般要求不高的程序代码如下:

#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的范围该如何解决?

嗯,用字符串嘿嘿!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐