http://blog.csdn.net/alongela/article/details/6747772
来源:互联网 发布:明华堂淘宝 编辑:程序博客网 时间:2024/06/05 07:36
HDU1060 数学方法实现超大数计算
分类: ACM解题报告 2011-09-04 20:34 277人阅读 评论(0)收藏举报
(转自网上牛人解题报告)
题目大意是输入N,求N^N的最高位数字。1<=N<=1,000,000,000
估计大家看到N的范围就没想法了。
确实N的数字太大,如果想算出结果,即使不溢出也会超时。
题目是这样转化的。
首先用科学计数法来表示 N^N = a*10^x;
比如N = 3; 3^3 = 2.7 * 10^1;
我们要求的最右边的数字就是(int)a,即a的整数部分;
OK, 然后两边同时取以10为底的对数 lg(N^N) = lg(a*10^x) ;
化简 N*lg(N) = lg(a) + x;
继续化 N*lg(N) - x = lg(a)
a = 10^(N*lg(N) - x);
现在就只有x是未知的了,如果能用n来表示x的话,这题就解出来了。
又因为,lg(a)是N^N的小数,x是N^N的整数部分。
实际上就是 x 就是lg(N^N) 向下取整数,表示为[lg(N^N)]
所以[lg(N^N)] = floor(N*lgN);
a = 10^(N*lg(N) - [lg(N^N)]);
然后(int)a 就是答案了。
- #include<iostream>
- #include<cmath>
- using namespace std;
- int main()
- {
- int ncase;
- __int64 n, ans;
- long double t;
- scanf("%d", &ncase);
- while (ncase--)
- {
- scanf("%I64d", &n);
- t = n * log10(n+0.0);
- t -= (__int64)t;
- ans = pow((long double)10, t);
- printf("%I64d\n", ans);
- }
- return 0;
- }
#include<iostream>#include<cmath>using namespace std;int main(){int ncase;__int64 n, ans;long double t;scanf("%d", &ncase);while (ncase--){scanf("%I64d", &n);t = n * log10(n+0.0);t -= (__int64)t;ans = pow((long double)10, t);printf("%I64d\n", ans);}return 0;}
long double的范围好像比__int64还要大。
0 0
- http://blog.csdn.net/alongela/article/details/6747772
- http://blog.csdn.net/alongela/article/details/6747772
- http://blog.csdn.net/IBM_hoojo/article/details/5688947
- http://blog.csdn.net/chenlaic/article/details/6143235
- http://blog.csdn.net/eaglewood2005/article/details/4335052
- http://blog.csdn.net/mchp/article/details/3995970
- http://blog.csdn.net/v_july_v/article/details/6015165
- http://blog.csdn.net/masterz/article/details/6232585
- http://blog.csdn.net/perfectpdl/article/details/6442847
- http://blog.csdn.net/eroswang/article/details/1967243
- http://blog.csdn.net/zhvsby/article/details/5986645
- http://blog.csdn.net/dz45693/article/details/6183645
- http://blog.csdn.net/david_lv/article/details/5798003
- http://blog.csdn.net/zxingchao2009/article/details/6299313
- http://blog.csdn.net/zhanxinhang/article/details/6783766
- http://blog.csdn.net/ruanruoshi/article/details/935510
- http://blog.csdn.net/yming0221/article/details/6538527
- http://blog.csdn.net/yming0221/article/details/6528490
- 一篇图像滤波的文章——收藏
- http://blog.csdn.net/alongela/article/details/6747772
- 【HDU 3518】Boring counting【扩展KMP】
- 史上最全设计模式导学目录(完整版)
- 循环-08. 二分法求多项式单根(20)
- http://blog.csdn.net/alongela/article/details/6747772
- 冒泡排序法
- java文件中的serialVersionUID
- 如何修改和查看tomcat内存大小
- Binary XML file line #74: Error inflating class
- java痛苦学习之路[十一]--收藏博客专家
- 1407230827-hd-数值统计.cpp
- 数据结构--线性表
- 求奇数的乘积