怎样求任意一个数的位数问题
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的范围该如何解决?
嗯,用字符串嘿嘿!
#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的范围该如何解决?
嗯,用字符串嘿嘿!
相关文章推荐
- 4:上网时只能打开一个IE窗口..不能打开第二个..怎样解决这个问题?
- 一个小问题的解决-----怎样把dataset转化成arraylist
- 怎样找到一个算法问题的答案
- 触发器问题(怎样在一个数据库中的触发器中访问另一个数据库里面的表呢)
- 一个很有趣的问题:那些用QQ邮箱发应聘邮件的人啊(附:怎样写一封得体的电子邮件)
- 判断任意位数的一个数是否为Armstrong数的算法
- 任意给出一个四位数, 把它重新组成一个四位的最大数和一个最小数, 算出两者间的差.
- 怎样才能把一个代码变成软件成品?一个初学者的困惑,我们写的代码都只能是解决一些数学问题而已。怎么把它变成一个软件。
- 给出任意一个日期, 怎样知道是星期几?
- 一个n位的数,去掉其中的k位,问怎样去使得留下来的(n-k)位数按原来的前后顺序组成的数最小
- 最近怎样 这是一个很难回答的问题
- C++递归问题之二——n皇后问题:以四、八皇后为例,给定n个皇后要求将它们放在一个n维矩阵中,任意两个皇后不能出现在同一行、列、主副对角线上,输出具体的摆放方式
- 关于怎样用javascript判断网页上我们想要必须选择的复选框至少选择一个的问题
- 数字黑洞:任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到 * 一个最大的数:65432,一个最小的数23456。
- 降序排列——对于一个大于3位数的任意整数
- 自然思考:流程任意定制的一个问题
- 编程题--任意给出一个四位数, 把它重新组成一个四位的最大数和一个最小数, 算出两者间的差
- javascript算法题:求任意一个1-9位不重复的N位数在该组合中的大小排列序号
- 怎样寻找最佳爱人:一个微积分求解的离散数学问题
- 一个n位的数,去掉其中的k位,问怎样去使得留下来的(n-k)位数按原来的前后顺序组成的数最小