宇宙总统
题目描述
地球历公元 6036 年,全宇宙准备竞选一个最贤能的人当总统,共有 n 个非凡拔尖的人竞选总统,现在票数已经统计完毕,请你算出谁能够当上总统。
输入格式
第一行为一个整数 n,代表竞选总统的人数。
接下来有 n 行,分别为第一个候选人到第 n个候选人的票数。
输出格式
共两行,第一行是一个整数 m,为当上总统的人的号数。
第二行是当上总统的人的选票。
样例 #1
样例输入 #1
5
98765
12365
87954
1022356
985678
样例输出 #1
4
1022356
提示
票数可能会很大,可能会到 100 位数字。
代码
import java.util.Scanner;
//P1781 宇宙总统
//票数可能会很大,可能会到 100 位数字。
//1≤n≤20。
public class UniversePresident {
public static void main(String[] args) {
//输入的数字可能会很大,超过了int类型范围甚至超过了long类型,所以使用String类型处理,或者使用BigInteger
Scanner scanner = new Scanner(System.in);
//输入n和选票
int n = scanner.nextInt();
String[] vote = new String[n];
for (int i = 0; i < vote.length; i++) {
vote[i] = scanner.next();
}
if (n == 1) {
System.out.println(vote[0]);
return;
}
int res = 0;
//比较String
for (int i = 1; i < vote.length; i++) {
//比较String的长度
if (vote[i].length() > vote[res].length()) {
res = i;
}else if (vote[i].length() == vote[res].length()) { //位数相等,比较大小
for (int j = 0; j < vote[res].length(); j++) {
if (vote[i].charAt(j) > vote[res].charAt(j)) { //如果不设置条件改变j,那下一次比较的就是下一位,就会造成错误
res = i;
break;
}else if (vote[i].charAt(j) == vote[res].charAt(j)) {
continue;
}else //还有vote[i].charAt(j) < vote[res].charAt(j) 的可能
break;
}
}
}
System.out.println(res+1);
System.out.println(vote[res]);
return;
}
}
思路分析
使用字符串对大数字进行比较
先比较 String 的长度,如果长度相等,则先比较这两个字符串的大小
从高位开始比较,如果出现不同,则退出这个循环。(注意在这里的逻辑不要写错,一定要想清楚)
分享另一种解法:BigInteger解法