解决方案 »

  1.   

    第一个问题给你提供一个比较笨的思路,把 i 的每一位分离出来,是哪给个数字,就给该数字的计数加1,如果有哪个计数大于等于4,就跳过去接着循环,否则输出
    第二个问题
     把经过第一个问题解决筛选出来的数字,在筛选出来的同时,把它的个位数字相加和30作比较,
    至于如何得到一个数的每一位
    public class test {
    public static void main(String[] args) {
    int s[] = new int[7];
    int a = 1234567;
    int i = 0, j = 0, k, m = 1, n;
    k = a;
    while (k != 0) {
    k /= 10;
    i++;
    }
    while (i != 0) {
    n = i-1;
    while (n != 0) {
    m = 0;
    m *= 10;
    n--;
    }
    s[j] = a % 10;
    System.out.print(s[j]);
    a /= 10;
    i--;
    j++;
    }
    }
    }这个程序是将一个数倒叙输出,你自己看着修改你的代码吧
      

  2.   

    问题还没有搞定啊? 看看下面这个代码吧1、核心逻辑
    public class NumberSelector { private final Map<Integer,List<String>> pickedCodes=new HashMap<Integer,List<String>>();
    private final static int MaxDuplicateFlag=4;

    private NumberSelector(){

    }

    private void init(){
    System.out.println("组合初始化,时间较长,请耐心等待....");
    //由于符合条件的数字组合是可以预知的,所以可以考虑从外部读取,而非每次计算
    for(int i=1111111;i<10000000;i++){
    String code=String.format("%07d", i);
    if(calcMaxDuplicate(code)){
    appendSumDigit(sumDigit(String.valueOf(i)),code);
    }
    if(code.endsWith("0000")){
    System.out.println(i+"初始化完毕");
    }
    }
    System.out.println("===组合初始化完毕===");
    }

    private void appendSumDigit(int key,String code){
    if(!pickedCodes.containsKey(key)){
    pickedCodes.put(key, new ArrayList<String>());
    }
    pickedCodes.get(key).add(code);
    }


    public List<String> getBySumDigit(int arg){
    if(pickedCodes.containsKey(arg)){
    return pickedCodes.get(arg);
    }
    return new ArrayList<String>();
    }
    private static NumberSelector instance=null;
    private static Object instanceLock=new Object();
    public static NumberSelector getInstance(){
    if(instance==null){
    synchronized (instanceLock) {
    if(instance==null){
    instance=new NumberSelector();
    instance.init();
    }
    }
    }
    return instance;
    } private static int sumDigit(String num){
    int reuslt=0;
    for(int i=0;i<num.length();i++){
    reuslt+=Integer.parseInt(num.substring(i, i+1));
    }
    return reuslt;
    }

    private static boolean calcMaxDuplicate(String num){
    int reuslt=0;
    for(int i=0;i<num.length();i++){
    String s=num.replaceAll(String.valueOf(i), "");
    reuslt= Math.max(reuslt,num.length()-s.length());
    if(reuslt>=MaxDuplicateFlag) return false;
    }
    return true;
    }

    }
    2、调用代码
    public static void demoNumberSelector(){
    NumberSelector selector=NumberSelector.getInstance();
    int input=30;
    List<String> result=selector.getBySumDigit(input);
    System.out.println("输入值:"+input+",共计"+result.size()+"个符合条件");
    System.out.println("----前10个数字如下----");
    for(int i=0;i<10;i++){
    if(i<result.size()){
    System.out.print(result.get(i)+",");
    }
    }
    System.out.println();
    System.out.println("-------------------");
    }
      

  3.   

    如果是这个输出,证明你没原样拷贝代码。 System.out.println("输入值:"+input+",共计"+result.size()+"个符合条件");这句要么没执行,要么被你删除掉了,你再仔细检查检查吧
      

  4.   

    import java.util.*;public class NumberSelector {
     
        private final Map<Integer,List<String>> pickedCodes=new HashMap<Integer,List<String>>();
        private final static int MaxDuplicateFlag=4;
         
        private NumberSelector(){
             
        }
         
        private void init(){
            System.out.println("组合初始化,时间较长,请耐心等待....");
            //由于符合条件的数字组合是可以预知的,所以可以考虑从外部读取,而非每次计算
            for(int i=1111111;i<10000000;i++){
                String code=String.format("%07d", i);
                if(calcMaxDuplicate(code)){
                    appendSumDigit(sumDigit(String.valueOf(i)),code);   
                }
                if(code.endsWith("0000")){
                    System.out.println(i+"初始化完毕");               
                }
            }
            System.out.println("===组合初始化完毕===");       
        }
         
        private void appendSumDigit(int key,String code){
            if(!pickedCodes.containsKey(key)){
                pickedCodes.put(key, new ArrayList<String>());
            }
            pickedCodes.get(key).add(code);
        }
             
         
        public List<String> getBySumDigit(int arg){
            if(pickedCodes.containsKey(arg)){
                return pickedCodes.get(arg);
            }
            return new ArrayList<String>();
        }
     
         
        private static NumberSelector instance=null;
        private static Object instanceLock=new Object();
        public static NumberSelector getInstance(){
            if(instance==null){
                synchronized (instanceLock) {
                    if(instance==null){
                        instance=new NumberSelector();   
                        instance.init();
                    }           
                }
            }
            return instance;
        }
     
        private static int sumDigit(String num){
            int reuslt=0;
            for(int i=0;i<num.length();i++){
                reuslt+=Integer.parseInt(num.substring(i, i+1));
            }
            return reuslt;
        }
         
        private static boolean calcMaxDuplicate(String num){
            int reuslt=0;
            for(int i=0;i<num.length();i++){
                String s=num.replaceAll(String.valueOf(i), "");
                reuslt= Math.max(reuslt,num.length()-s.length());
                if(reuslt>=MaxDuplicateFlag) return false;
            }       
            return true;
        }   
        public static void demoNumberSelector(){
         NumberSelector selector=NumberSelector.getInstance();
         int input=30;
         List<String> result=selector.getBySumDigit(input);
         System.out.println("输入值:"+input+",共计"+result.size()+"个符合条件");
         System.out.println("----前10个数字如下----");
         for(int i=0;i<10;i++){
         if(i<result.size()){
         System.out.print(result.get(i)+",");
         }
         }
         System.out.println();
         System.out.println("-------------------");    } 
    }
       看看哪里问题。。
      

  5.   

    你的调用入口在哪里?从哪里调用的demoNumberSelector()? 光把代码放那里,不执行肯定没有用,找跟你一起做项目的人问问吧
      

  6.   

    import java.util.ArrayList;
     
    public class T {
        public static void getAllDataNotNeed(){
            String saveDataToString;
            ArrayList<String> allDataNoNeed=new ArrayList();
            for(int i=1111111;i<=1119999;i++){
                int[] digitalMumber=new int[7];
                int[] arr=new int[9];
                saveDataToString=String.valueOf(i);
                int count=0;
                for(int j=0;j<saveDataToString.length();j++){
                    digitalMumber[j]=(int)saveDataToString.charAt(6-j)-48;
                    // you should care there
                    if(digitalMumber[j]!=0){
                        count++;
                    }
                }
                if(count!=7){
                    allDataNoNeed.add(saveDataToString);
                     
                }else{
                    for(int j=0;j<saveDataToString.length();j++){
                        arr[digitalMumber[j]-1]++;
                        if(arr[digitalMumber[j]-1]>2){
                            allDataNoNeed.add(saveDataToString);
                            break;
     
                        }
                    }
                }
            }
     
            for(int k=0;k<allDataNoNeed.size();k++){
                //System.out.println(1);
                System.out.println(allDataNoNeed.get(k));
            }
        }
        public static void getValueWanted(int valueWanted){
            String saveDataToString;
            for(int i=1111111;i<=1119999;i++){
                int[] digitalMumber=new int[7];
                int[] arr=new int[9];
                saveDataToString=String.valueOf(i);
                 
                int sum=0;
                int count=0;
                for(int j=0;j<saveDataToString.length();j++){
                    digitalMumber[j]=(int)saveDataToString.charAt(6-j)-48;
                    // you should care there
                    if(digitalMumber[j]!=0){
                        count++;
                    }
                }
                if(count==7){
                    for(int j=0;j<saveDataToString.length();j++)
                        sum+=digitalMumber[j];
                     
                }
                if(sum==valueWanted){
                    System.out.println("sum is "+valueWanted+" : "+saveDataToString);
                }
            }
        }
        public static void main(String[] args){
    //        String s="1231231";
    //        System.out.println((int)s.charAt(2)-48);
            getAllDataNotNeed();
            //输出所有不需要的组合
            //因为需要的组合太多只能以相反的代替
            getValueWanted(34);
            //输入你想要得到的和值
     
        }
     
    }
    上次回的贴并没用把问题解释清楚,这次把思路说一下,
    1.把整数用String.valueOf()方法转化成字符串,转化成字符串以后(例如123转化成”123“,字符串第零位是1),用charAt方法转化成单个字符(不过这时候数据类型是char,int i=char(1),输出值为49,减去48变为int型变量。)这样就能实现对每一位的相加求和的目的。
    2.继续利用1方法,不过多写一个数组int[] arr=new int[9],此数组用来保存1、2.9各数字重复出现的数字的次数。
    例如arr[string.charAt[i]-1]++,意思为,这个字符串上的第i位(假设值为1)出现的次数在arr[1-1]保存,每出现一次,则加一。
      

  7.   


     * 采用正则表达式
     */
    package des;import java.util.ArrayList;
    import java.util.List;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;public class MatchesGui {
    public static void main(String[] args) {

    List list = new ArrayList<>();
            for(int i=1111111;i<10000000;i++){
             Pattern p=Pattern.compile("(\\w)\\1{3,}");  
                Matcher m=p.matcher(i+""); 
               
                if (!(m.find())) {
                 System.out.println(i);
                 list.add(i);
    }
            }
    }
         
    }