POJ 1423 &&hdu 1018 Big Number【数学】

81 篇文章 0 订阅
58 篇文章 0 订阅

Big Number

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 32172 Accepted Submission(s): 15038


Problem Description
In many applications very large integers numbers are required. Some of these applications are using keys for secure transmission of data, encryption, etc. In this problem you are given a number, you have to determine the number of digits in the factorial of the number.

Input
Input consists of several lines of integer numbers. The first line contains an integer n, which is the number of cases to be tested, followed by n lines, one integer 1 ≤ n ≤ 10 7 on each line.

Output
The output contains the number of digits in the factorial of the integers appearing in the input.

Sample Input
  
  
2 10 20

Sample Output
  
  
7 19


给出一个数,求这个数的阶乘有多少位..........

首先,大数处理比较复杂,很难实现,然后有个公式:斯特林公式,但是个人不会用...

后来见到学长用了取对数的方法,瞬间顿悟......

很久之前就做过了..........

但是现在却因为log 函数对参数的类型要求太严格,CE了........

看来以后还要注意参数的类型啊,编译器也是靠不住啊......... 


#include<stdio.h>
#include<math.h>
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int n;
		scanf("%d",&n);
		double sum=1;
		for(int i=1;i<=n;++i)
		{
			sum+=log10(i*1.0); 
		}
		printf("%d\n",(int)sum);
	}
	return 0;
}


2016年2月2日21:59

 

大约学习了一下斯特林公式.....

加上对数的性质的运用...

 

#include<stdio.h>
#include<math.h>
double pi=acos(-1),e=2.718281828459;
//实在不知道怎么记住e了 
int stl(int n)
{
	double x=(double)n;
	return (int)(log10(sqrt(2*pi*x))+x*log10(x/e)+1);
}
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int n;
		scanf("%d",&n);
		printf("%d\n",stl(n));
	}
	return 0;
}

 

 

 2016年3月18日


 在poj 上做了一次,才发现原来自己以前的方法原来是有漏洞的........

对于1的情况,判断错误,后来发现竟然是因为(int)x+1 和 (int)(x+1) 的结果不一样。到底回事,我也不清楚.............

然后还有floor 函数的取整,也是有些微区别的......

好多函数啊,都搞混乱了..........


不过另有所获:

学会了使用一个函数 :exp(1.0) 用这个计算机e 的相关数据就比较方便了!


#include<stdio.h>
#include<math.h>
double e=exp(1.0),pi=acos(-1);
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		double n;
		scanf("%lf",&n);
		n=log10(sqrt(2*pi*n))+n*log10(n/e);
		printf("%d\n",(int)n+1);
	}
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值