在不断学习的过程中也不能忘记了基础知识的巩固,在学习新的知识后要学会去举一反三,前不久我刚刚了解了一些关于 string 类的知识,对牛客网的 自守数 有了新的解题思路,让我们一起看看这道题吧
思路解析
a. 整数方法
1. 首先我们知道自守数就是一个数的平方位数等于该数本身,所以我们的思路就是找出要求 得范围内所有数的平方并取出其位数,判断该数是否为自守数
2.所以我们就可以写出函数分别用来求出整数的位数与取出该数平方的位数,然后循环遍历 判断是否符合条件,最后返回所给范围内自守数的个数
b. 字符串方法
1. 将整数转化为字符串类型,使用下标遍历的方法,从字符串尾开始依次遍历比较该数与该 数平方,十分便捷
#include<iostream>
#include<cmath>
using namespace std;
//逆置数字
int reverse(int num)
{int ret = 0;while (num){ret = (ret * 10) + (num % 10);num = num / 10;}return ret;
}
//计算整数的位数
int CountDigit(int num)
{if (num < 0){num = -num;}return num > 0 ? int(log10(num) + 1) : 1;
}
//得到整数的后位数
int GetEndDigit(int num, int count)
{int ret = 0;while (count--){ret = ret * 10 + num % 10;num = num / 10;}return reverse(ret);
}
int main()
{int digit = 0;int sum = 0;cin >> digit;for (int i = 0; i <= digit; i++){int count = CountDigit(i);int ret = pow(i, 2);int end = GetEndDigit(ret, count);;if (end == i){sum++;}}cout << sum << endl;return 0;
}
#include <iostream>
#include <string>
#include <cmath>
using namespace std;bool Isrepe(int k)
{int num = pow(k, 2);string s1 = to_string(ret);string s2 = to_string(num);int n1 = s1.size() - 1, n2 = s2.size() - 1;while (n1 >= 0) {if (s1[n1] != s2[n2]) {break;}n1--;n2--;}if (n1 < 0) return true;else return false;
}int main()
{int n;while (cin >> n) {int ans = 0;for (int i = 0; i <= n; i++) {if (Isrepe(i)) ans++;}cout << ans << endl;}return 0;
}
代码解析
a. 整数方法
1. 首先使用三个函数 CountDigit 函数求取该数的位数,GetEndDigit 函数取出该数平方的 尾数的逆置, reversw 函数进行二次逆置,即取出该数平方的真正尾数,然后使用循环 遍历比较判断所规定范围内的自守数个数即可
b. 字符串方法
1. 将该数与该数的平方分别使用 to_string 接口转化为字符串,然后使用 string::size 接口 求得两数的长度,从尾部开始两数依次向前遍历,即 n1-- ,n2-- ,n1 代表原来数字的长 度,如果符合自守数的概念,那么遍历完成后 n1 < 0,以此作为判断条件,最后求得规定 范围内自守数的个数