华为机试HJ6-HJ10
HJ6 质数因子
题目描述
功能:输入一个正整数,按照从小到大的顺序输出它的所有质因子(重复的也要列举)(如180的质因子为2 2 3 3 5 )
最后一个数后面也要有空格
输入描述:
输入一个long型整数
输出描述:
按照从小到大的顺序输出它的所有质数的因子,以空格隔开。最后一个数后面也要有空格。
示例1
输入
180
输出
2 2 3 3 5
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long num = sc.nextLong();
System.out.println(getResult(num));
}
public static String getResult(long num) {
StringBuilder sb = new StringBuilder("");
for (long i = 2; i <= num; i++) {
if (num % i == 0) {
sb.append(i + " ");
num /= i;
i = 1;//每次从最小质数2开始寻找
}
}
return sb.toString();
}
}
- 递归
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long num = sc.nextLong();
getResult(num);
}
public static void getResult(long num) {
for (long i = 2; i <= num; i++) {
if (num % i == 0) {
System.out.print(i + " ");
num /= i;
getResult(num);
break;//一旦找到一个质数就num /= i,就把接下来的任务交给递归的getResult(num).
}
}
}
}
HJ7 取近似值
题目描述
写出一个程序,接受一个正浮点数值,输出该数值的近似整数值。如果小数点后数值大于等于5,向上取整;小于5,则向下取整。
输入描述:
输入一个正浮点数值
输出描述:
输出该数值的近似整数值
示例1
输入
5.5
输出
6
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
float num = sc.nextFloat();
if (num - (int)num >= 0.5) {
System.out.println((int)(num + 1));
} else {
System.out.println((int)num);
}
}
}
- 调用Math.round方法
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
float num = sc.nextFloat();
System.out.println(Math.round(num));
}
}
HJ8 合并表记录
题目描述
数据表记录包含表索引和数值(int范围的整数),请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出。
输入描述:
先输入键值对的个数
然后输入成对的index和value值,以空格隔开
输出描述:
输出合并后的键值对(多行)
示例1
输入
4
0 1
0 2
1 2
3 4
输出
0 3
1 2
3 4
- 利用TreeMap排序的性质
import java.util.Scanner;
import java.util.TreeMap;
public class Main {
public static void main (String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int n = sc.nextInt();
TreeMap<Integer, Integer> tm = new TreeMap<Integer, Integer>();
for (int i = 0; i < n; i++) {
int key = sc.nextInt();
int value = sc.nextInt();
if(tm.containsKey(key)) {
value += tm.get(key);
}
tm.put(key, value);
}
for (int key : tm.keySet()) {
System.out.println(key + " " + tm.get(key));
}
}
}
}
HJ9 提取不重复的整数
题目描述
输入一个int型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数。
输入描述:
输入一个int型整数
输出描述:
按照从右向左的阅读顺序,返回一个不含重复数字的新的整数
示例1
输入
9876673
输出
37689
import java.util.Scanner;
public class Main {
public static void main (String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
int[] a = new int[10];
while (num != 0) {
int ex = num % 10;
num /= 10;
a[ex]++;
if(a[ex] > 1)
continue;
System.out.print(ex);
}
}
}
HJ10 字符个数统计
题目描述
编写一个函数,计算字符串中含有的不同字符的个数。字符在ACSII码范围内(0~127),换行表示结束符,不算在字符里。不在范围内的不作统计。多个相同的字符只计算一次
输入
abaca
输出
3
输入描述:
输入N个字符,字符在ACSII码范围内。
输出描述:
输出范围在(0~127)字符的个数。
示例1
输入
abc
输出
3
import java.util.Scanner;
public class Main {
public static void main (String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
int[] a = new int[128];
for (int i = 0; i < str.length(); i++) {
int temp = (int)str.charAt(i);
a[temp]++;
}
int count = 0;
for (int j = 0; j < 128; j++) {
if(a[j] != 0) {
count++;
}
}
System.out.println(count);
}
}