Java刷题笔记
Q7nl1s admin

花了点时间用 Java 刷了刷欧拉计划的题,发现题目还是很简单的,算法思想很少,但由于之前都没用 Java 刷过,所以某些函数的使用,以及大数运算的处理并不到位,所以在做的过程中学习了,一下并且做了这篇笔记。

以下是欧拉计划的中译站点 Project Euler | 欧拉计划 (pe-cn.github.io)

解题模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package Week_1;

// title
// 阶乘各位数的和

// context
// n! = n × (n - 1) × ... × 3 × 2 × 1
// 例如, 10! = 10 × 9 × ... × 3 × 2 × 1 = 3628800,
// 那么 10! 的各位之和就是 3 + 6 + 2 + 8 + 8 + 0 + 0 = 27.
// 算出 100! 的各位之和。

// answer
// 答案:648

public class Ex_20 {
public static void main(String[] args) {
System.out.println(new Ex_20().run());
}
public int run(){
int num = 100;
return st(num);
}
private int st(int num){
int sum = 0;
BigInteger a = new BigInteger("1");
for(int i=1;i<=num;i++){
a = a.multiply(new BigInteger(i+""));
}
String str = a.toString();
for(int i = 0;i < str.length();i++){
sum += str.charAt(i)-'0';
}
return sum;
}
}

以上就是一个简单的 Java 解题模板,其大致结构如下:

  • 一个 main 函数用于启动程序,并打印答案
  • 一个 run 函数用于返回结果
  • 零个或多个 st 函数用于处理题目中各个模块的逻辑

大数处理

基本类型的取值范围

在介绍大数运算之前我们先回顾一下 int(Integer) long(Long) double(Double) 的取值范围

  • int(Integer): -2147483648 ~ -2147483648
  • long(Long): 9223372036854775807L ~ 9223372036854775808L
  • double(Double): 1.7976931348623157e+308 ~ 4.9e-324

当然忘记了也没关系,我们可以通过它们各自包装类的 MAX_VALUE 属性来进行查看

大数处理的使用情况

大数处理的题常常是以字符串的形式出现的。这时候情况就有以下几种(我目前接触到的)

  1. 多个大数之间的运算 —> 用字符数组处理
  2. 一个大数进行多次运算 —> 用 BigInteger / BigDecimal 进行处理,它们都是 Java 内置类 Math 下的方法

技巧

单个 char 数字转 int 数字的技巧:’9’-‘0’ = 9

待更新…

 Comments
Comment plugin failed to load
Loading comment plugin
Powered by Hexo & Theme Keep
Unique Visitor Page View