题目:
如果一个数的数字分为两组,其中一组数字的和等于另一组数字的和,这样的数成为神奇数;
比如:242,满足:2+2=4
要求:统计在给定区间内的神奇数的个数
输入(1<=l<=10^9,其中l为最小的区间数)
输入:
1 50
输出:
4
分析:
- 如果和为奇数,则返回判断结果为false;
- 如果和为偶数:
分别计算每个组合的值,将其对应位置标为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.考虑问题太过于局限;
网友评论