Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], skipTags: ["script","noscript","style","textarea","code"], processEscapes: true }});

問題文

2つの整数 $A$，$B$ がある。
十進数での筆算によって $A - B$ を求める処理を以下に示す。

　1. $A$，$B$ を十進数で表現する。添字は下位から順に $0,1,2,...,n-1$ とし、 $A = A_{n-1} A_{n-2} ... A_{0}$，$B = B_{n-1} B_{n-2} ... B_{0}$ とする。 $n$ は十進数で表現した時の$A$の桁数とする。 $B$ の桁数が $n$ より小さいとき、上位桁に $0$ を補う。

　2. $borrow_{0} = 0$ とする。

　3. 以下の処理を $i = 0$ から $n-1$ まで繰り返す。

　　3.1. $A_{i} - borrow_{i} \geq B_{i}$ ならば、 $C_{i} = A_{i} - borrow_{i} - B_{i}$ ， $borrow_{i+1} = 0$とする。

　　3.2. $A_{i} - borrow_{i} \lt B_{i}$ ならば、 $C_{i} = A_{i} - borrow_{i} + 10 - B_{i}$ ， $borrow_{i+1} = 1$とする。

$A - B$ の計算結果は $C_{n-1} C_{n-2} ... C_{0}$ となる。ただし、最上位に連続する $0$ は取り除く。

繰り下がりを忘れると3.2の処理での $borrow_{i+1} = 1$ が $borrow_{i+1} = 0$ となる。
最大 $K$ 回繰り下がりを忘れたときの計算結果の最大値を求めよ。

入力

入力は以下の形式に従う。与えられる数は全て整数である。

$A$ $B$ $K$

制約

$1 \leq B \lt A \leq 10^9$

$1 \leq K \leq 9$

出力

計算結果の最大値を1行に出力せよ。

Sample Input 1

99 98 1

Output for the Sample Input 1

1

Sample Input 2

100 2 3

Output for the Sample Input 2

198

Sample Input 3

538 84 1

Output for the Sample Input 3

554

Sample Input 4

2012 1987 1

Output for the Sample Input 4

1025

Solution in JAVA (judge verdict: Accepted)

import java.util.Scanner;

class Main{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        int a, b, k;
        int[] da = new int[12], db = new int[12], br = new int[12];
        a = in.nextInt();
        b = in.nextInt();
        k = in.nextInt();
        for(int i = 0; i < 10; i++){
            da[i] = a%10;
            db[i] = b%10;
            br[i] = 0;
            a /= 10; b /= 10;
        }
        int maxValue = 0;
        for(int i = 0; i < (1 << 9); i++){
            int nBit = 0;
            for(int j = i; j > 0; j /= 2) nBit += j % 2;
            if(nBit > k) continue;
            int mul = 1, value = 0;
            for(int j = 0; j < 9; j++, mul *= 10){
                br[j+1] = 0;
                value += (da[j] - db[j] - br[j]+ 10) % 10 * mul;
                if(da[j] - db[j] - br[j] < 0){
                    br[j+1] = 1;
                    if((i >> j) % 2 == 1){
                        br[j+1] = 0;
                    }
                }
            }
            if(value > maxValue){
                maxValue = value;
            }
        }
        System.out.println(maxValue);
    }
}