首页 > 试题广场 >

神奇数

[编程题]神奇数
  • 热度指数:3235 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
东东在一本古籍上看到有一种神奇数,如果能够将一个数的数字分成两组,其中一组数字的和等于另一组数字的和,我们就将这个数称为神奇数。例如 242 就是一个神奇数,我们能够将这个数的数字分成两组,分别是 {2,2} 以及 {4} ,而且这两组数的和都是 4 .东东现在需要统计给定区间中有多少个神奇数,即给定区间 [l, r] ,统计这个区间中有多少个神奇数,请你来帮助他。

数据范围:

输入描述:
输入包括一行,一行中两个整数l和r(1 ≤ l, r ≤ 10^9, 0 ≤ r - l ≤ 10^6),以空格分割


输出描述:
输出一个整数,即区间内的神奇数个数
示例1

输入

1 50

输出

4
示例2

输入

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;

}

}

发表于 2018-08-17 14:59:59 回复(0)