牛客网每日刷题之 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,以此作为判断条件,最后求得规定 范围内自守数的个数

相关推荐
知无不研3 小时前
lambda表达式的使用(3)
开发语言·c++·lambda
C++ 老炮儿的技术栈5 小时前
基于Qt实现轻量化本地音乐播放器
开发语言·c++·qt·c·播放器·音乐
qz_Serene7 小时前
C++:类和对象(上)
开发语言·c++
郝学胜-神的一滴8 小时前
干货版《算法导论》17:二叉树核心原理、遍历逻辑与高阶实操全解
数据结构·c++·python·算法·计算机·编程
hetao17338379 小时前
2026-08-09~08-14 hetao1733837 的刷题记录
c++·算法
间歇性努力持续性发呆的野生快乐选手11 小时前
栈的性质(进栈,出栈,访问)
数据结构·c++
旖旎夜光11 小时前
LeetCode 904:水果成篮(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口
hansang_IR12 小时前
【题解】P14468 [COCI 2025/2026 #1] 和谐 / Harmonija(线段树 DDP 版本)
c++·算法·动态dp
乐观勇敢坚强的老彭13 小时前
C++ 竞赛常用算法模板速查表
开发语言·c++·算法
我变成萤火虫13 小时前
河南萌新联赛2026第(三)场:郑州轻工业大学
数据结构·c++·算法·贪心算法·stl·深度优先·哈希算法