请教一个算法问题。。。

冷西瓜 学生  2016-06-13 10:31:13
就是我要求(阶乘) N! 的值的位数,为什么可以用取对数log10的方法来求呢?
...全文
116 点赞 收藏 10
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
冷西瓜 2016-06-15
引用 6 楼 FancyMouse 的回复:
一个数x有N位,因为第一项至少是1,所以x>=10^(N-1)。因为高于N位的数码都是0,所以x<=9*10^(N-1)+9*10^(N-2)+...+9<10^N 10^(N-1)<=x<10^N 两边取log10 N-1<=log10(x)<N
多谢耐心解答!
回复
冷西瓜 2016-06-15
引用 4 楼 lm_whales 的回复:
1)乘积化和: lg(a*b) = lg(a)+lg(b) 2)位数和对数的关系, 对于一个大于0 的数 x 常用对数的整数部分加一,就是位数 假设 lg(x) =n+lg(t) //1<=t <10 则有 x= t *10^n 也就数有 n+1位数 lg(1)=0 lg(2)=0.3010 lg(10)=1 3)常用对数 lg C语言中, 用库函数 log10表示 常用对数lg就是以10为底数的对数
多谢耐心解答!
回复
赵4老师 2016-06-14
仅供参考:
#include<stdio.h>
#define N 1000    //要计算的N
long s[N]={1,1},n=N,t=2,a=1,b=0;
int main()//雨中飞燕之作
{
    for(;a<=*s||(++t<=n?(b=0,a=1):0);(*s==a++&&b)?(*s)++:0)
        s[a]=(b+=s[a]*t)%10000,b/=10000;
    for(printf("%d",s[*s]);--*s>0;) printf("%04d",s[*s]);
    return 0;
}
回复
FancyMouse 2016-06-14
一个数x有N位,因为第一项至少是1,所以x>=10^(N-1)。因为高于N位的数码都是0,所以x<=9*10^(N-1)+9*10^(N-2)+...+9<10^N 10^(N-1)<=x<10^N 两边取log10 N-1<=log10(x)<N
回复
lm_whales 2016-06-13
对于一个大于1 的数 x 当整数部分为负值的时候,表示这个是小于1 就变成计算小数位数了
回复
lm_whales 2016-06-13
1)乘积化和: lg(a*b) = lg(a)+lg(b) 2)位数和对数的关系, 对于一个大于0 的数 x 常用对数的整数部分加一,就是位数 假设 lg(x) =n+lg(t) //1<=t <10 则有 x= t *10^n 也就数有 n+1位数 lg(1)=0 lg(2)=0.3010 lg(10)=1 3)常用对数 lg C语言中, 用库函数 log10表示 常用对数lg就是以10为底数的对数
回复
冷西瓜 2016-06-13
引用 2 楼 lm_whales 的回复:
数学上是没问题的 唯一有问题的,是精度问题 因为 n^ ( log( n,x)) =x; 所以 log(n,x) 的整数部分就是 x的位数 (x>0), 如果位数为负值 ,则该数字小于1 成绩的对数,等于对数和,所以这个加法没问题,可以求出位数,如果能够计算出并且精确度可控 那么这么做就可以了,不然会有误差
我就是想知道数学上这个怎么解释?解释为什么可以以取对数的方法来求它的位数?
回复
lm_whales 2016-06-13
数学上是没问题的 唯一有问题的,是精度问题 因为 n^ ( log( n,x)) =x; 所以 log(n,x) 的整数部分就是 x的位数 (x>0), 如果位数为负值 ,则该数字小于1 成绩的对数,等于对数和,所以这个加法没问题,可以求出位数,如果能够计算出并且精确度可控 那么这么做就可以了,不然会有误差
回复
冷西瓜 2016-06-13
      scanf("%d",&m);
      sum=0;
      for(i=1;i<=m;i++)
      {
          sum=sum+log10((double)i);
          }
      printf("%d\n",(int)sum+1);
回复
相关推荐
发帖
C语言
创建于2007-09-28

6.4w+

社区成员

C语言相关问题讨论
申请成为版主
帖子事件
创建了帖子
2016-06-13 10:31
社区公告
暂无公告