编程之美 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]); } } }