当前位置:   article > 正文

Java 求最小公倍数 + 大数阶乘 + K-好数问题_bigdecimal求最小公倍数

bigdecimal求最小公倍数

2018年5月17日20:22:26   清理垃圾

最小公倍数的求法:



输入2个正整数A,B,求甲与乙的最小公倍数。


输入

2个数A,B,中间用空格隔开。(1 <= A,B <= 10 ^ 9)


输出

输出甲与乙的最小公倍数。


样例输入

30 105
87 92

样例输出

210
8004

代码:

  1. package cugoj;
  2. import java.util.Scanner;
  3. /*
  4. * 求最小公倍数
  5. * 就是先求出最大公约数,然后用两个数之积除以最大公约数即可
  6. */
  7. public class Main514B {
  8. public static void main(String[] args)
  9. {
  10. // TODO Auto-generated method stub
  11. Scanner s1 = new Scanner(System.in);
  12. while(s1.hasNextInt())
  13. {
  14. long a = s1.nextLong();
  15. long b = s1.nextLong();
  16. long mod = a % b;
  17. if(mod == 0)
  18. {
  19. System.out.println(a);
  20. }
  21. long result = a*b/getMaxMult(a, b);
  22. System.out.println(result);
  23. }
  24. s1.close();
  25. }
  26. private static long getMaxMult(long a, long b)
  27. {
  28. long m = a % b;
  29. while (m != 0) {
  30. a = b;
  31. b = m;
  32. m = a % b;
  33. }
  34. return b;
  35. }
  36. }


大数阶乘的问题:

题目描述

给出一个数n,输出n的阶乘结果的位数

输入

每一行都是一个整数n 

(0<=n<=3x10^6,主要卡数据长度,不卡时间)

(多组输入)

输出

输出该整数n的阶乘结果的位数

样例输入

5
3

样例输出

3
1

代码1使用biginteger


  1. package bignumbers;
  2. /*
  3. * 描述:用biginteger来实现大数阶乘
  4. * compareTo方法用来比较,小于则返回-1,等于则返回0,大于则返回1
  5. * biginteger对象的比较compareTo和equal有区别,前者是返回int值,后者是返回的布尔值
  6. * 最终证明在oj网站上运行会超时
  7. * */
  8. import java.math.BigInteger;
  9. import java.util.Scanner;
  10. public class dashujiecheng {
  11. public static void main(String[] args)
  12. {
  13. // TODO Auto-generated method stub
  14. Scanner s1=new Scanner(System.in);
  15. while(s1.hasNext())
  16. {
  17. BigInteger n=new BigInteger(s1.next()); //System.out.println(n);
  18. /*BigInteger a=BigInteger.ONE;
  19. BigInteger b=BigInteger.ONE;*/
  20. BigInteger a=new BigInteger("1");
  21. BigInteger b=new BigInteger("1");
  22. for (BigInteger i=new BigInteger("1");i.compareTo(n)<=0;i=i.add(a))//忘记将自加后的赋值了
  23. {
  24. b=b.multiply(i);
  25. }
  26. //System.out.println(b);
  27. System.out.println("这个阶乘结果的位数为 "+b.toString().length());
  28. }
  29. s1.close();
  30. }
  31. }

代码2  使用log函数

  1. package cugoj;
  2. import java.math.BigDecimal;
  3. import java.util.Scanner;
  4. /*描述
  5. * 输入:
  6. 每行输入1个正整数n, (0<n<1000 000)
  7. 输出:
  8. 对于每个n,输出n!的(十进制)位数。
  9. 分析:
  10. 所谓n!的十进制位数,就是 log(n!)+1, 根据数学公式有:n!=1*2*3*.....*n;
  11. lg(n!)=lg(2)+......lg(n);
  12. 这个方法在cugoj上头时间超时了
  13. *
  14. * */
  15. public class Main514E {
  16. public static void main(String[] args)
  17. {
  18. // TODO Auto-generated method stub
  19. Scanner s1=new Scanner(System.in);
  20. while (s1.hasNext())
  21. {
  22. long n=s1.nextLong();
  23. double sum=0;
  24. for (long i=2;i<n+1;i++)
  25. {
  26. BigDecimal bigDecimal=new BigDecimal(Math.log10(i));
  27. sum=sum+bigDecimal.doubleValue();
  28. }
  29. System.out.println((int)sum+1);
  30. }
  31. s1.close();
  32. }
  33. }

代码3  使用斯特林公式

  1. package cugoj;
  2. /*描述
  3. * 采用斯特林公式来计算大数阶乘的位数
  4. * */
  5. import java.util.Scanner;
  6. public class Main514E2 {
  7. public static void main(String[] args)
  8. {
  9. // TODO Auto-generated method stub
  10. Scanner s1=new Scanner(System.in);
  11. while (s1.hasNext())
  12. {
  13. int n=s1.nextInt();
  14. int res=0;
  15. if(n==1)
  16. {
  17. System.out.println(1);
  18. }else {
  19. res=(int)(Math.log10(2.0*3.1415926*n)/2+n*Math.log10(n/2.71828182))+1;
  20. System.out.println(res);
  21. }
  22. }
  23. s1.close();
  24. }
  25. }



关于K-好数的问题:

题目描述

如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数。求L位K进制数中K好数的数目。例如K = 4,L = 2的时候,所有K好数为11、13、20、22、30、31、33 共7个。由于这个数目很大,请你输出它对1000000007取模后的值。

输入

输入包含两个正整数,K和L。

输出

输出一个整数,表示答案对1000000007取模后的值。

样例输入

4 2

样例输出

7

提示代码

  1. package cugoj;
  2. /*描述
  3. * 题目描述
  4. 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数。求L位K进制数中K好数的数目。例如K = 4,L = 2的时候,所有K好数为11、13、20、22、30、31、33 共7个。由于这个数目很大,请你输出它对1000000007取模后的值。
  5. 输入
  6. 输入包含两个正整数,K和L。
  7. 输出
  8. 输出一个整数,表示答案对1000000007取模后的值。
  9. 样例输入
  10. 4 2
  11. 样例输出
  12. 7
  13. *
  14. * */
  15. import java.util.Scanner;
  16. public class Main514F {
  17. final static int MOD = 1000000007;
  18. public static void main(String[] args)
  19. {
  20. Scanner s1 = new Scanner(System.in);
  21. while (s1.hasNext()) {
  22. int k = s1.nextInt();
  23. int l = s1.nextInt();
  24. int num = 0;
  25. int[][] nums = new int[l][k];
  26. for (int i = 0; i < l; i++)
  27. for (int j = 0; j < k; j++)
  28. nums[i][j] = 0;
  29. for (int j = 0; j < k; j++)
  30. nums[0][j] = 1;
  31. for (int i = 1; i < l; i++)
  32. for (int j = 0; j < k; j++)
  33. for (int x = 0; x < k; x++) {
  34. if (x != j - 1 && x != j + 1) {
  35. nums[i][j] += nums[i - 1][x];
  36. nums[i][j] %= MOD;
  37. }
  38. }
  39. for (int j = 1; j < k; j++) {
  40. num += nums[l - 1][j];
  41. num %= MOD;
  42. }
  43. System.out.println(num);
  44. }
  45. s1.close();
  46. }
  47. }

输入2个正整数A,B,求甲与乙的最小公倍数。


输入

2个数A,B,中间用空格隔开。(1 <= A,B <= 10 ^ 9)


输出

输出甲与乙的最小公倍数。


样例输入

30 105
87 92

样例输出

210
8004

提示

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/326254
推荐阅读
相关标签
  

闽ICP备14008679号