美文网首页
神奇数-(京东2018)

神奇数-(京东2018)

作者: 天使的流浪 | 来源:发表于2019-01-05 12:02 被阅读0次

    题目:
    如果一个数的数字分为两组,其中一组数字的和等于另一组数字的和,这样的数成为神奇数;
    比如:242,满足:2+2=4
    要求:统计在给定区间内的神奇数的个数
    输入(1<=l<=10^9,其中l为最小的区间数)
    输入:
    1 50
    输出:
    4
    分析:

    1. 如果和为奇数,则返回判断结果为false;
    2. 如果和为偶数:
      分别计算每个组合的值,将其对应位置标为true;
      如果最终的(和/2) 的位置为true的话,表示该数为神奇数;
    package com.bj.jingdong;
    
    import java.util.Scanner;
    
    public class Test2 {
        public static void main(String[] args) {
            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(checkNumber(i))
                    sum++;
            }
            System.out.println(sum);
        }
        //判断是否为神奇数
        private static 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;
            int array_size = max_num(str,B_sum)+1;
            boolean[] f = new boolean[array_size];
            f[str[0]] = true;
                // 计算满足条件(小于B_sum )的所有组合情况,将其对应位置标为true
            for(int i = 1; i < cur; i++){
                int value = str[i];
                for(int j = array_size-1; j >= 0; --j){         //只能逆序循环,因为下一行会把f[j+value]改为true
                    if(f[j] && j + value <= array_size-1)       //顺序循环的话,j=k时,将k+value设为true,当j读到k+value时就出问题了
                        f[j + value] = true;
                }
                if(f[B_sum]) {
                    System.out.println(N);
                    return true;
                }
            }
            return false;
        }
        // 计算数组中的元素和数组和的1/2哪一个更大,用于定义数组长度
        public static int max_num(int num[],int num1){
            int  max_temp = 0;
            for (int i = 0; i < num.length; i++) {
                if(num[i]>max_temp){
                    max_temp = num[i];
                }
            }
            if(num1>max_temp) max_temp = num1;
            return max_temp;
            
        }
    }
    

    知识点:
    1.数组的基本使用;
    2.考虑问题太过于局限;

    相关文章

      网友评论

          本文标题:神奇数-(京东2018)

          本文链接:https://www.haomeiwen.com/subject/nwhkrqtx.html