首页 > 试题广场 >

自守数

[编程题]自守数
  • 热度指数:156791 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
\hspace{15pt}自守数是指这样一个自然数 x,其平方的尾数等于自身。更具体的说,即 x^2 的末尾若干位恰好等于 x,例如:
\hspace{23pt}\bullet\, 25^2=625625 的末尾两位恰好是 25
\hspace{23pt}\bullet\, 76^2=57765776 的末尾两位恰好是 76
\hspace{23pt}\bullet\, 9\,376^2=87\,909\,37687\,909\,376 的末尾四位恰好是 9\,376
\hspace{15pt}现在,对于给定的 n,请统计 0n 之间的自守数个数。

输入描述:
\hspace{15pt}输入一个整数 n \left(1 \leqq n \leqq 10^4\right) 代表自守数的范围。


输出描述:
\hspace{15pt}输出一个整数,代表 0n 之间的自守数个数。
示例1

输入

25

输出

5

说明

\hspace{15pt}在这个样例中,0,1,5,6,25 是自守数。
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,至此已经计算了后四位没必要再计算了,而且满足条件,则成立。

发表于 2020-06-09 14:59:54 回复(1)

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;

}

发表于 2018-06-22 21:46:21 回复(0)