输入一个整数
代表自守数的范围。
输出一个整数,代表
到
之间的自守数个数。
25
5
在这个样例中,
是自守数。
while( n = readline()){ var res = []; for(var num = 0 ; num <= +n ; num ++){ var len = (num + '').length; var str = (num + ''); var all = 0; var istrue = true; for(var i = 0 ; i < len ; i ++){ for(var j = 0 ; j <= i ; j ++){ all += str[len-1-j] * str[len-1-(i-j)] * Math.pow(10, i); } if((all + '').slice(-i-1) !== str.slice(-i-1)){ istrue = false; break; } } if(istrue) { res.push(num); } } console.log(res.length); }害怕暴力求解会产生问题,所以想了想办法先把乘法表达式分解,从后向前一位一位的乘,比如9376,先计算最后一个数,应该为6*6取后一位,为6,在计算最后两位6*6+6*7*10+7*6*10=876,也满足,再计算后三位,876 + 3*6*10^2 + 7*7*10^2 + 6*3*10^2 = 9376, 也满足,再计算最后四位,9376 + 9*6*10^3 + 3*7*10^3 + 7*3*10^3 + 6*9*10^3 = 159376,至此已经计算了后四位没必要再计算了,而且满足条件,则成立。
var readline = require('readline');
var ri = readline.createInterface({
input: process.stdin,
output: process.stdout
});
ri.on("line",function(data){
console.log(zishou(data));
})
function zishou(data) {
var count=0;
for(var i=0;i<data;i++){
var t=i*i;
var str0=t.toString();
var str1=t.toString().length;
var str2=i.toString();
if(str0.slice(str1-str2.length)==i.toString()){
count++;
}
}
return count;
}