题目
描述
自守数是指一个数的平方的尾数等于该数自身的自然数。例如:25^2 = 625,76^2 = 5776,9376^2 = 87909376。请求出n(包括n)以内的自守数的个数
数据范围: 1≤n≤10000
输入描述:
int型整数
输出描述:
n以内自守数的数量。
示例1
输入:
6
输出:
4
说明:
有0,1,5,6这四个自守数
示例2
输入:
1
输出:
2
说明:
有0, 1这两个自守数
分析
求自守数的解题思路
规律:个位数为 0、1、5、6 的数才可能是自守数,故采用筛选法,只判断符合该条件的数
- 思路1:可以把整数(数及其平方)转换为字符串,通过比较长字符串的末尾是否与短字符串相同即可如:25 * 25 = 625,字符串’625’的末尾’25’与字符串’25’的相同
- 思路2:若该数的平方与该数的差,去模该数对应的各个进制位均等于零,则该数为自守数
如:25 * 25 = 625,625 - 25 = 600,600 % (10*1) = 0,600 % (10 * 2) = 0
*/
代码
#include<iostream>
using namespace std;
bool is_self_protect(int num){
int tmp = num;
int n = num * num;
while(tmp){
if(tmp % 10 != n % 10) return false;
tmp/= 10;
n /= 10;
}
return true;
}
int main(){
int n;
int cnt = 0;
cin >> n;
for(int i = 0; i <= 1000; ++i){
int num = i * 10;
if(num > n) break;
if(num <= n && is_self_protect(num)) ++cnt;
if(num+1 <= n && is_self_protect(num+1)) ++cnt;
if(num+5 <= n && is_self_protect(num+5)) ++cnt;
if(num+6 <= n && is_self_protect(num+6)) ++cnt;
}
cout << cnt << endl;
return 0;
}