Supervin有一个独特的计算器。
此计算器由一个显示器,一个加号按钮和一个减号按钮构成。
目前,计算器显示器上显示整数 N。
按加号按钮可将计算器显示屏上显示的当前数字增加1。
同理,按减号按钮可将计算器显示屏上显示的当前数字减1。
计算器不显示任何前导零。
例如,如果计算器显示屏上显示100,则按减号按钮一次将使计算器显示99。
Supervin不喜欢奇数,因为他认为他们是“奇怪的”。
因此,他想通过按动计算器上的按钮来改变显示器上的数字,使得显示数字变为一个全部数位上数字均为偶数的十进制数。
因为计算器比较老旧,按钮并不是很好用,因此Supervin希望尽可能少的按动按钮。
请帮助Supervin确定要使得显示数字各个数位均为偶数,至少需要按动多少次按钮。
输入格式
输入第一行包含整数T,表示共有T组测试数据。
接下来T行,每行包含一个整数N,表示显示器上最初显示的数字。
输出格式
每组测试数据输出一个结果,每个结果占一行。
结果表示为“Case #x: y”,其中x为组别编号(从1开始),y为该组数据结果(即最少按动次数)。
数据范围
1≤T≤100,
1≤N≤1016
输入样例:
4
42
11
1
2018
输出样例:
Case #1: 0
Case #2: 3
Case #3: 1
Case #4: 2
样例解释
在样例#1中,最初显示在计算器上的整数各位均为偶数,因此不需要按下按钮。
在样例#2中,最少按动三次减号按钮使计算器显示8。
在样例#3中,最少按动减号按钮一次使计算器显示0或按动加号按钮一次使计算器显示2。
在样例#4中,最少按动两次加号按钮将使计算器显示2020。
算法:模拟。我们注意到,无论是按“+”还是“-”,两者同时存在的情况下会相互抵消。所以我们只需要考虑只按“+”或只按“-”的时候谁需要的次数更小即可。
当我们按"+"时,我们需要的是找到大于等于当前数的最小偶数,所以在碰到第一个奇数时,此奇数加1,后面全置为0;
当我们按“-”时,我们需要的是找到小于等于当前数的最大偶数,所有在碰到第一个奇数时,此奇数减1,后面全置为8;
另外需要注意,当奇数为9时,由于“+”需要进位,进位后前一位变奇,需要加更多,所以不需考虑“+”,只需考虑“-”即可。
import java.util.List;
import java.util.ArrayList;
import java.util.Scanner;
public class KickStart {
public static void main(String[] args) {
calculator();
}
public static void calculator() {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
for(int i = 0; i < n; i++) {
int num1 = sc.nextInt();
int num = num1;
List<Integer> list = new ArrayList<>();
while(num != 0) {
list.add(num % 10);
num = num / 10;
}
int nnn = 0;
for(int j = list.size() - 1; j >= 0; j--) {
int number = list.get(j);
if(number % 2 == 1) {
// 第一个奇数
if(number == 9) {
int len = j;
while(len >= 0) {
nnn = nnn * 10 + 8;
len--;
}
break;
} else {
// 大的 奇数位加1 后面全0
int nLarge = nnn;
nLarge = nnn * 10 + number + 1;
int len = j;
while(len > 0) {
nLarge = nLarge * 10;
len--;
}
// 小的 奇数位减1 后面全8
int nSmall = nnn;
nSmall = nnn * 10 + number - 1;
len = j;
while(len > 0) {
nSmall = nSmall * 10 + 8;
len--;
}
nnn = (nLarge - num1) < (num1 - nSmall) ? nLarge : nSmall;
break;
}
} else {
// 偶数
nnn = nnn * 10 + number;
}
}
System.out.println("Case #" + (i + 1) + ":" + nnn + " " + Math.abs(num1 - nnn));
}
}
};