编程之美 2.8找到合适的数字

还有两点没有理解:

1.当数字很大时会超过INT的表示范围,书中使用记录大整数中1的位置

2.如果某个循环中没有新的余数更新,那么就不存在这样的数M

public class Main {
    public static void main(String[] args) {
        int n=99;
        System.out.println(find(n));
    }
    public static int find(int n){
        int[] before=new int[n];
        int[] after=new int[n];
        int step=1;
        boolean flag=false;
        while(!flag){
            for(int i=0;i<n;i++){
                after[i]=0;
            }
            int remain=step%n;
            if(before[remain]==0){
                after[remain]=step;
                if(remain==0){
                    break;
                }
            }
            for(int i=1;i<n;i++){
                if(before[i]==0){
                    continue;
                }
                int tempRemain=(remain+i)%n;
                if(before[tempRemain]==0 && after[tempRemain]==0){
                    after[tempRemain]=step+before[i];
                    if(tempRemain==0){
                        flag=true;
                        break;
                    }
                }
            }
            step*=10;
            for(int i=0;i<n;i++){
                if(before[i]==0 && after[i]!=0){
                    before[i]=after[i];
                }
            }
        }
        return after[0];
    }
}

 解法2:跟书本一致

import java.util.*;
public class Main{
    public static void main(String[] args) {
        int N=133;
        String[] s=new String[N];
        for(int i=0;i<N;i++){
            s[i]="";
        }
        s[1]="0";
        int noUpdate=0;
        for(int i=1,j=10%N;;i++,j=(j*10)%N){
            boolean flag=false;
            if(s[j].length()==0){
                s[j]+=i;
            }
            for(int k=1;k<N;k++){
                if(s[k].length()>0 && i>(s[k].charAt(s[k].length()-1)-'0') && s[(k+j)%N].length()==0){
                    s[(k+j)%N]=s[k]+i;
                    flag=true;
                }
            }
            if(flag==false){
                noUpdate++;
            }
            if(noUpdate==N || s[0].length()>0){
                break;
            }
        }
        if(s[0].length()==0){
            System.out.println("no answer");
        }else{
            System.out.println(s[0]);
        }
    }
}

 

posted @ 2018-03-19 20:47  xinyilovestudy  阅读(121)  评论(0编辑  收藏  举报