牛客网每日刷题之 HJ99.自守数(C++)

在不断学习的过程中也不能忘记了基础知识的巩固,在学习新的知识后要学会去举一反三,前不久我刚刚了解了一些关于 string 类的知识,对牛客网的 自守数 有了新的解题思路,让我们一起看看这道题吧

思路解析

a. 整数方法

1. 首先我们知道自守数就是一个数的平方位数等于该数本身,所以我们的思路就是找出要求 得范围内所有数的平方并取出其位数,判断该数是否为自守数

2.所以我们就可以写出函数分别用来求出整数的位数与取出该数平方的位数,然后循环遍历 判断是否符合条件,最后返回所给范围内自守数的个数

b. 字符串方法

1. 将整数转化为字符串类型,使用下标遍历的方法,从字符串尾开始依次遍历比较该数与该 数平方,十分便捷

cpp 复制代码
#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;
}
cpp 复制代码
#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,以此作为判断条件,最后求得规定 范围内自守数的个数

相关推荐
qq_454175799 分钟前
c++学习-this指针
开发语言·c++·学习
超闻逸事1 小时前
【题解】[UTPC2024] C.Card Deck
c++·算法
暴力求解1 小时前
C++类和对象(上)
开发语言·c++·算法
让我们一起加油好吗2 小时前
【基础算法】枚举(普通枚举、二进制枚举)
开发语言·c++·算法·二进制·枚举·位运算
大锦终2 小时前
【C++】特殊类设计
开发语言·c++
泽02022 小时前
C++之STL--list
开发语言·c++·list
Dovis(誓平步青云)4 小时前
探索C++标准模板库(STL):String接口的底层实现(下篇)
开发语言·c++·stl·string
KyollBM5 小时前
【CF】Day75——CF (Div. 2) B (数学 + 贪心) + CF 882 (Div. 2) C (01Trie | 区间最大异或和)
c语言·c++·算法
feiyangqingyun5 小时前
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
c++·qt·udp·gb28181
CV点灯大师5 小时前
C++算法训练营 Day10 栈与队列(1)
c++·redis·算法