牛客网每日刷题之 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 小时前
# 用 5 个问题学懂 C++ 虚函数(入门级)
c++
不想写代码的星星7 小时前
虚函数表:C++ 多态背后的那个男人
c++
端平入洛2 天前
delete又未完全delete
c++
端平入洛3 天前
auto有时不auto
c++
哇哈哈20214 天前
信号量和信号
linux·c++
多恩Stone4 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc
蜡笔小马4 天前
21.Boost.Geometry disjoint、distance、envelope、equals、expand和for_each算法接口详解
c++·算法·boost
超级大福宝4 天前
N皇后问题:经典回溯算法的一些分析
数据结构·c++·算法·leetcode
weiabc4 天前
printf(“%lf“, ys) 和 cout << ys 输出的浮点数格式存在细微差异
数据结构·c++·算法
问好眼4 天前
《算法竞赛进阶指南》0x01 位运算-3.64位整数乘法
c++·算法·位运算·信息学奥赛