题解 | #自守数#
自守数
http://www.nowcoder.com/practice/88ddd31618f04514ae3a689e83f3ab8e
java 带缓存的暴力解法
import java.util.*; public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); TreeMap<Integer,Integer> map = new TreeMap<>();///保存遍历过的数 while(sc.hasNext()){ int result = 0;//结果 int num = sc.nextInt(); int start = -1;//保证start从0开始 Map.Entry pre = null;//保存上一个entry for(Map.Entry e : map.entrySet()){//遍历map,查找第一个大于num的记录 if(pre != null && (Integer)e.getKey() > num){ result = (Integer)pre.getValue();//拿上一个键值对,更新起始和当前result,从那之后继续追加result start = (Integer)pre.getKey(); break; }else if((Integer)e.getKey() == num){ result = (Integer)e.getValue();//恰巧有计算过的值 start = (Integer)e.getKey(); break; } pre = e;//缓存上一个键值对 } for(int i = start+1;i<=num;i++){//从start后一位开始,继续查找 //对于 i = 25 int k = 1; while(k <= i){ k *= 10; //k =100 } int a = i * i % (k); // a = 625%100 = 25 int b = i ; // b = 25 if(a == b){ result++; } } map.put(num,result);//缓存记录 System.out.println(result); } } }