已知一个整数n,求n^n的前k位
2017-05-27 15:36
92 查看
这个题目咋眼不是很难,不就是求一下nn么,大不了计算机费点时间,但是当你真的把代码写好后,你会发现当n=15(1515=437893890380859375)的时候,你的变量就扛不住了,再大了就产生了溢出,咋办呢?
我们可以换个角度想一个这个问题,假设
y=nn
于是
log10y=nlog10n
这个方法是不是很眼熟,眼熟就对了,在以前数理统计中最大似然计算中不就是经常这么干么。
假设
log10y=N+f
其中N是整数部分,f是小数部分。
整数部分就不用考虑了,要考虑就考虑小数部分,实际上最后的答案只与10f相关。
假如 log10y=3871.137516=3871+0.137516,3871就不用考虑了,只考虑0.137516,因为100.137516=1.3725115252693768903012478615047,现在就看
代码实现:
我们可以换个角度想一个这个问题,假设
y=nn
于是
log10y=nlog10n
这个方法是不是很眼熟,眼熟就对了,在以前数理统计中最大似然计算中不就是经常这么干么。
假设
log10y=N+f
其中N是整数部分,f是小数部分。
整数部分就不用考虑了,要考虑就考虑小数部分,实际上最后的答案只与10f相关。
假如 log10y=3871.137516=3871+0.137516,3871就不用考虑了,只考虑0.137516,因为100.137516=1.3725115252693768903012478615047,现在就看
k是多少了,假设k是8,那么前8位就是13725115。
代码实现:
public class KDigitSquare { public static long firstkdigits(int n, int k) { double product = n * Math.log10(n); double decimal_part = product - Math.floor(product); decimal_part = Math.pow(10, decimal_part); double digits = Math.pow(10, k - 1), i = 0; return ((long) (decimal_part * digits)); } public static void main(String[] args) { int n = 1450; int k = 6; System.out.println(firstkdigits(n, k)); } }
相关文章推荐
- 现在有一个整数数组,已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数
- 有一个正整数,已知它的末位数字是6,如果将这个6移动到该数的最前面,那么所得到的数是原来数的4倍,求满足条件的最小正整数。
- 已知一个数组,每一行都按照从左到右递增的顺序排序, 每一列都按照从上到下递增的顺序排序。请完成一个函数, 输入这样的一个二维数组和一个整数,判断数组中是否含有该整数
- 60}的C程序 高手帮忙写下`` 46 35 27 21 16 10 9 5 然后输出数组a。已知 int a[11]={1 使数组a仍然有序 将x插入到有序整型数组a中 由键盘输入一个整数x
- 风口之下,猪都能飞。当今中国股市牛市,真可谓“错过等七年”。 给你一个回顾历史的机会,已知一支股票连续n天的价格走势,以长度为n的整数数组表示,数组中第i个元素(prices[i])代表该股票第i天的股价。 假设你一开始没有股票,但有至多两次买入1股而后卖出1股的机会,并且买入前一定要先保证手上没有股票。若两次交易机会都放弃,收益为0。 设计算法,计算你能获得的最大收益。 输入数值范围:2<=n<
- 问题描述 已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少。 输入格式 输入一个正整数N。 输出格式 输出一个整数,表示你找到的最小公倍数。 样例输入 9 样例输出 5
- 现在有一个整数数组,已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数
- 已知w是一个大于10但不大于1000000的无符号整数,若w是n(n≥2)位的整数,则求出w的后n-1位的数。
- 现在有一个整数数组,已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数
- 判断用户输入的一个整数是否在以已知数组中
- 已知一个整数数组A[n],写出算法实现将奇数元素放在数组的左边,将偶数放在数组的右边。要求时间复杂度为O(n)。
- 已知一个整数N,求另外一个整数M,使得M本身 + M各个位上的数 = N
- 现在有一个整数数组,已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数
- 风口之下,猪都能飞。当今中国股市牛市,真可谓“错过等七年”。 给你一个回顾历史的机会,已知一支股票连续n天的价格走势,以长度为n的整数数组表示,
- leetcode 321. Create Maximum Number 根据两个整数创造一个有k位的最大的数 + 贪心算法
- 已知Sn=1+1-2+1-3+...+1-n,对于任意一个整数K,当n满足够大的时候,Sn-K
- 风口之下,猪都能飞。当今中国股市牛市,真可谓“错过等七年”。 给你一个回顾历史的机会,已知一支股票连续n天的价格走势,以长度为n的整数数组表示,数组中第i个元素(prices[i])代表该股票第i天
- 已知一个整数N,求另外一个整数M,使得M本身 + M各个位上的数 = N
- 风口之下,猪都能飞。当今中国股市牛市,真可谓“错过等七年”。 给你一个回顾历史的机会,已知一支股票连续n天的价格走势,以长度为n的整数数组表示,
- 在已知文件的指定位置,写一个整数