题目链接:自守数_牛客题霸_牛客网
注意点:
参考了评论区大佬的方法,简洁易懂
1.首先0必定是自守数,算作初始为1。我们可以遍历1到n验证每个数i是否是自守数。
2.如果它是自守数,那么i^2对i这么多位零的整十整百或者整千整万数取余就会得到i本身
3.我们可以在遍历的时候初始取模为10,每当i等于模将其扩大十倍即可。
#include <iostream>
using namespace std;
int main(){
int n ;
int tmp = 1;
int base = 10;
while(cin >> n){
for(int i = 1; i <=n ; ++i){
int sq = i * i;
//保证取余的位数和i一致
if(i == base) base *= 10;
//取余后是否和i相等
if (sq % base == i) tmp++;
}
cout << tmp << endl;
}
return 0;
}