题解 | #自守数#
自守数
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);
}
}
}
深信服公司福利 826人发布