hdoj刷题二(java):2010-2019
目录
题目、分析与代码
Problem - 2010 水仙花数
再跳说不过去了,这里写一下, 个人觉得这里最难的是数位的拆分。有两种方法:
- 读取成数字,然后先取余,再除10,循环
- 读取成字符串,获取子串,再用
parseInt()
我的骨子里还是个 C语言
程序员,且第一种明显高效,这里用第一种
还有对于输出的处理,最后一个输出后没有空格,采取的方式见代码。
以及我犯的一个错误,判断是否为水仙花数,多次除10后,原数已经变成0,需要一个新变量记录原来的数,即那个变量 n
。还有一种解决方式是,把 sum
等于 num
,然后一个个减去,最后判断 sum
是不是0就行。
这题我 Presentation Error
好多次,太难受了!上面还有一点忘了,就是一组结束后,要加换行!
import java.util.Scanner;
/**
* @author lhp
* @description TODO
* @date 2021/3/7 22:37
*/
public class P2010 {
public static void main(String[] args) {
int min, max;
Scanner sc = new Scanner(System.in);
while (sc.hasNext()){
min = sc.nextInt();
max = sc.nextInt();
int i=min;
// 为了实现最后一个数字后没空格,这里把空格加到数字的前面
// 所以第一个数字要特殊处理
for (; i<=max; i++){
if (isNarcissusNum(i)){
System.out.print(i);
// 这里i不自增的话和输出两遍第一个数
i++;
break;
}
}
// 如果 i>max 说明一个数字也没
if (i > max){
System.out.print("no");
}
for (; i<=max; i++){
if (isNarcissusNum(i)){
System.out.print(" " + i);
}
}
//这里记得换行
System.out.println();
}
}
private static boolean isNarcissusNum(int num){
int sum = 0, n =num;
while (n > 0){
int digit = n % 10;
sum += digit * digit * digit;
n /= 10;
}
return num == sum;
}
}
Problem - 2011 多项式求和
这题就弄个 for
循环吧,应该能过
Problem - 2012 素数判定
这题很经典,LeetCode 刷过,用厄拉多塞筛法,直接当时的笔记拿过来。
解法一:暴力法(超时),不详细展开
解法二:暴力法优化,循环上限开个根号,循环步长改为2,即排除偶数
解法三:厄拉多塞筛法,顺序遍历(从2开始),每取得一个数,那么它的倍数就一定不是素数,筛去,以此类推,题解原文
题解代码:(哈哈哈这代码好像是当时复制的别人的 C++
)
int countPrimes(int n) {
int count = 0;
//初始默认所有数为质数
vector<bool> signs(n, true);
for (int i = 2; i < n; i++) {
if (signs[i]) {
count++;
for (int j = i + i; j < n; j += i) {
//排除不是质数的数
signs[j] = false;
}
}
}
return count;
}
未完待续,要结合题目把这题写出来。
这题还学到了一个List
初始化的方法:
//新建长度为n的 Boolean List,初始化为 true
List<Boolean> signs = new ArrayList<>(Collections.nCopies(n, true) );
Problem - 2013 蟠桃记
数学题,每次 + 1 再 *2
Problem - 2014 青年歌手大奖赛_评委会打分
使用 sort
函数排序
Problem - 2015 偶数求和
挨个加就好,不过先用 n / m * m
这个操作算出前面 n 的倍数,剩下的几个再根据数量算平均值
Problem - 2016 数据的交换输出
遍历就完事~
Problem - 2017 字符串统计
判断是否是数字可以这样,两种方法,我还是喜欢第一种偏C的
String s = "a1";
System.out.println('0'<=s.charAt(1) && s.charAt(1)<='9'); //输出true
System.out.println(Character.isDigit(s.charAt(1))); //输出true
Problem - 2018 母牛的故事
用一个数组递推即可
Problem - 2019 数列有序!
插入排序,注意以下几个细节:
- 哨兵
- 输出格式
- 最后一个数字后没有空格
- 记得每组输出后换行
import java.util.Scanner;
/**
* @author lhp
* @description TODO
* @date 2021/3/8 19:31
*/
public class P2019 {
public static void main(String[] args) {
int m, n;
Scanner sc = new Scanner(System.in);
while (sc.hasNext()){
n = sc.nextInt();
m = sc.nextInt();
if (m == 0 && n == 0){
break;
}
int[] nums = new int[n+2];
for (int i=1; i<=n; i++){
nums[i] = sc.nextInt();
}
nums[0] = m;
int j = n;
for (; nums[j] > nums [0]; j--){
nums[j+1] = nums[j];
}
//注意这里是j+1
nums[j+1] = m;
for (int k=1; k<n+1; k++){
System.out.print(nums[k] + " ");
}
//最后一个数字后没有空格,以及记得换行
System.out.println(nums[n+1]);
}
}
}