kick start 只有加减的计算器

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));
		}
	}
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值