东东在一本古籍上看到有一种神奇数,如果能够将一个数的数字分成两组,其中一组数字的和等于另一组数字的和,我们就将这个数称为神奇数。例如 242 就是一个神奇数,我们能够将这个数的数字分成两组,分别是 {2,2} 以及 {4} ,而且这两组数的和都是 4 .东东现在需要统计给定区间中有多少个神奇数,即给定区间 [l, r] ,统计这个区间中有多少个神奇数,请你来帮助他。
数据范围:
, 
输入包括一行,一行中两个整数l和r(1 ≤ l, r ≤ 10^9, 0 ≤ r - l ≤ 10^6),以空格分割
输出一个整数,即区间内的神奇数个数
1 50
4
11 11
1
import java.util.Scanner;
public class Main {
public static void main(String[] args) { Main test = new Main(); Scanner in = new Scanner(System.in); int l, n; l = in.nextInt(); n = in.nextInt(); in.close(); int sum = 0; for(int i = l; i <= n; i++){ if(test.checkNumber(i)) sum++; } System.out.println(sum); } private boolean checkNumber(int N){ int B_sum = 0,n = N,cur = 0; int[] str = new int[10]; while(n > 0){ str[cur] = n % 10; B_sum += str[cur]; cur++; n /= 10; } if((B_sum % 2) != 0) return false; B_sum /= 2; boolean[] f = new boolean[41]; f[str[0]] = true; for(int i = 1; i < cur; i++){ int value = str[i]; for(int j = 40; j >= 0; --j){ //只能逆序循环,因为下一行会把f[j+value]改为true if(f[j] && j + value <= 40) //顺序循环的话,j=k时,将k+value设为true,当j读到k+value时就出问题了 f[j + value] = true; } if(f[B_sum]) { return true; } } return false; }
}