码迷,mamicode.com
首页 > 其他好文 > 详细

CVTE笔试—数字分割

时间:2017-09-03 14:11:17      阅读:162      评论:0      收藏:0      [点我收藏+]

标签: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  
View Code

 

CVTE笔试—数字分割

标签:size   分割   mat   异常   标记   com   span   lap   计数   

原文地址:http://www.cnblogs.com/xyzyj/p/7469356.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!