标签:size 分割 mat 异常 标记 com span lap 计数
欢迎转载,转载请注明出处:http://www.cnblogs.com/xyzyj/p/7469356.html
题目:给定一个整数n和一个整数m,将n按照位分割成多个数字,使得这多个数字的和最接近m,
例如n=654321,m=50,则最大值为48(6+5+4+32+1)。
分析:(1)对于一个Integer类型的数字n和m,首先有种异常情况; 即 n<m :直接返回n;
(2)将整数n按位存入一个整型数组中,所求的最大值的位数肯定小于等于m的位数,
则以2为大小作为窗口在n所在的数组上进行滑动,每滑动一次,将窗口中的数字表示成十进制并和窗口为的其他数字进行相加,判断是否大于设定的一个numMax,
并且这个数字小于m,则将这个数字赋给numMax。
(3)依次增加窗口的大小直到小于等于m的位数为止。
java代码:
1 import java.util.Scanner; 2 3 /* 4 * 题目:给定一个整数n和一个整数m,将n按照位分割成多个数字,使得这多个数字的和最接近m, 5 * 例如n=654321,m=50,则最大值为48(6+5+4+32+1) 6 * */ 7 public class Main { 8 // 求最大值 9 public static Integer plimit(Integer n, Integer m) { 10 if (n < m) 11 return n; 12 Integer add = 0; //把所有的位加起来的和 13 Integer maxNum = 0; //最终所求结果 14 Integer count = 0; //辅助计数器,计算每个子数组中按位加起来的的和 15 Integer madd = 0; //辅助计数,把每个子数组中的数字表示成十进制 16 Integer mc = 0; //辅助计数,把每个子数组中的数字表示成十进和其他位按位加起来的总和 17 int a = 0, b = 0; //标记子数组第一位和最后一位的指针 18 String nstr = n.toString(); //将n转化成字符串 19 String mstr = m.toString(); //将m转化字符串 20 int nlength = nstr.length(); // n的长度 21 int mlength = mstr.length(); // m的长度 22 int[] narr = new int[nlength]; // 新建一个数组用来保存num每一位的数字 23 for (int i = 0; i < nlength; i++) { 24 Character ch = nstr.charAt(i); // 遍历nstr将每一位数字添加到narr 25 narr[i] = Integer.parseInt(ch.toString()); 26 } 27 for (int i = 0; i < nlength; i++) { 28 add += narr[i]; 29 } 30 if (add < m){ 31 for (int i = 2; i <= mlength; i++) { 32 a = 0; 33 b = i - 1; 34 while (b < nlength) { 35 for (int j = a; j <=b; j++) { 36 //System.out.println("j="+j); 37 count += narr[j]; 38 madd = madd + (int) (narr[j] * Math.pow(10, (b - j))); 39 a++; 40 } 41 mc = (add - count) + madd; 42 //System.out.println("mc="+mc); 43 if (mc > maxNum && mc < m) { 44 maxNum = mc; 45 } 46 b++; 47 a = b - i + 1; 48 madd=0; 49 count=0; 50 //System.out.println("a= b="+a+" "+b); 51 } 52 53 } 54 } 55 return maxNum; 56 } 57 58 public static void main(String[] args) { 59 Scanner in = new Scanner(System.in); 60 Integer n = in.nextInt(); 61 Integer m = in.nextInt(); 62 System.out.println(plimit(n, m)); 63 } 64 65 } 66 /* 67 例一: 68 输入: 69 654321 70 50 71 输出: 72 48 73 例一: 74 输入: 75 654321 76 661 77 输出: 78 600 79 */ 80
标签:size 分割 mat 异常 标记 com span lap 计数
原文地址:http://www.cnblogs.com/xyzyj/p/7469356.html