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

相关推荐
小鲈鱼-1 分钟前
【LeetCode4.寻找两个正序数组的中位数】二分O(log(m+n))
c++·算法
橘颂TA4 分钟前
【C++】红黑树的底层思想 and 大厂面试常问
数据结构·c++·算法·红黑树
三体世界39 分钟前
TCP传输控制层协议深入理解
linux·服务器·开发语言·网络·c++·网络协议·tcp/ip
你的冰西瓜1 小时前
C++ 中最短路算法的详细介绍
c++·算法·图论·最短路
<但凡.1 小时前
数据结构与算法之美:广义表
数据结构·c++·算法
大白的编程日记.3 小时前
【计算机基础理论知识】C++篇(二)
开发语言·c++·学习
C语言小火车3 小时前
野指针:C/C++内存管理的“幽灵陷阱”与系统化规避策略
c语言·c++·学习·指针
凤年徐3 小时前
【数据结构】时间复杂度和空间复杂度
c语言·数据结构·c++·笔记·算法
踏莎行hyx4 小时前
使用langchain连接llama.cpp部署的本地deepseek大模型开发简单的LLM应用
c++·ai·langchain·大模型·llama.cpp·deepseek
山河木马4 小时前
前端学C++可太简单了:双冒号 :: 操作符
前端·javascript·c++