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

相关推荐
星光樱梦16 分钟前
24. 正则表达式
c++
fathing17 分钟前
c# 调用c++ 的dll 出现找不到函数入口点
开发语言·c++·c#
hope_wisdom1 小时前
C++网络编程之SSL/TLS加密通信
网络·c++·ssl·tls·加密通信
erxij1 小时前
【游戏引擎之路】登神长阶(十四)——OpenGL教程:士别三日,当刮目相看
c++·经验分享·游戏·3d·游戏引擎
林开落L2 小时前
前缀和算法习题篇(上)
c++·算法·leetcode
Prejudices2 小时前
C++如何调用Python脚本
开发语言·c++·python
单音GG2 小时前
推荐一个基于协程的C++(lua)游戏服务器
服务器·c++·游戏·lua
qing_0406032 小时前
C++——多态
开发语言·c++·多态
孙同学_2 小时前
【C++】—掌握STL vector 类:“Vector简介:动态数组的高效应用”
开发语言·c++
charlie1145141913 小时前
Qt Event事件系统小探2
c++·qt·拖放·事件系统