华为机试HJ99:自守数(附带提速方案)

简介: 华为机试HJ99:自守数(附带提速方案)

题目描述:

自守数是指一个数的平方的尾数等于该数自身的自然数。例如:25^2 = 625,76^2 = 5776,9376^2 = 87909376。请求出n(包括n)以内的自守数的个数

本题有多组输入数据,请使用while(cin>>)等方式处理

输入描述:

int型整数

输出描述:

n以内自守数的数量。

示例:

输入:

5

2000


输出:

3

8


说明:

对于样例一,有0,1,5,这三个自守数

解题思路:

这题是数字分析题。通过对自然数的平方数分析,来判断该自然数是否为自守数。我采用了字符串的方式进行分析,也可以用数字运算的方式,都行。代码见正常版本。


本文我主要想分享下我的提速方案,代码见提速版本。这道题目因为要多次输入,我想假如第一次输入了一个很大的数,第二次输入的数如果比上个数小,那可以直接从上个数的结果容器中快速获取答案,若比上个数大,那只需要在上个数的基础上继续往后分析即可,不需要再从头分析一遍,那样可太慢了。所以我用maxnum来表征当前已分析过的数字的最大值,每次输入新的数字,只需判断下即可,处理起来非常快。


效果对比见文末。

测试代码:

1)正常版本

#include <iostream>
#include <vector>
#include <string>
using namespace std;
vector<int> results;
bool isAN(int num)
{
    int square=num*num;
    string sn=to_string(num);
    string ss=to_string(square);
    int k=ss.size()-1;
    for(int i=sn.size()-1;i>=0;--i)
    {
        if(sn[i]!=ss[k])
            return false;
        k--;
    }
    return true;
}
int getAN(int num)
{
    int sum=0;
    int k=results[results.size()-1];
    for(int i=0;i<=num;++i)
    {
        if(isAN(i))
        {
            results.push_back(i);
            sum++;
        }
    }
    return sum;
}
int main()
{
    int num;
    while(cin>>num)
    {
        cout<<getAN(num)<<endl;
    }
    return 0;
}

2)提速版本

#include <iostream>
#include <vector>
#include <string>
#include <time.h>
using namespace std;
vector<int> results;
int maxnum = -1;
// 自守数Autonomous number
bool isAN(int num)
{
  int square = num * num;
  string sn = to_string(num);
  string ss = to_string(square);
  int k = ss.size() - 1;
  for (int i = sn.size() - 1; i >= 0; --i)
  {
    if (sn[i] != ss[k])
      return false;
    k--;
  }
  return true;
}
int getAN(int num)
{
  int sum = 0;
  int k;
  int size = results.size();
  if (maxnum < num)
  {
    sum += size;
    for (int i = maxnum+1; i <= num; ++i)
    {
      if (isAN(i))
      {
        results.push_back(i);
        sum++;
      }
    }
    maxnum = num;
  }
  else {
    for (int i = 0; i < size; ++i)
    {
      if (results[i] <= num)
        sum++;
    }
  }
  return sum;
}
int main()
{
  int num;
  while (cin >> num)
  {
    //clock_t s, e;
    //s = clock();
    cout << getAN(num) << endl;
    //e = clock();
    //cout << "time:" << e - s << endl;
  }
  return 0;
}

提速效果:

      输入2000010、2000000、2000100、700四个数,看运行时长。

1)正常版本:

 

2)提速版本:

是不是提速非常的明显,代码也只稍微变换了逻辑,这就是算法的魅力。

相关文章
|
缓存 Ubuntu Linux
LXC (Linux 虚拟环境)简单介绍
LXC是Linux containers的简称,操作系统级别的虚拟化技术。它可以在操作系统层次上为进程提供的虚拟的执行环境。一个虚拟的执行环境被称为一个容器(container)。可以为容器绑定特定的cpu和memory节点,分配特定比例的cpu时间、IO时间,限制可以使用的内存大小(包括内存和是swap空间),提供device访问控制,提供独立的namespace(网络、pid、ipc、mnt、uts)。
1348 0
LXC (Linux 虚拟环境)简单介绍
28个残疾人,两个月,被阿里客服改变的命运
十年里,阿里巴巴云客服累计免费培训了35万人,为11万人提供了就业岗位,这28个残疾人也正是这11万人中的一份子。
28个残疾人,两个月,被阿里客服改变的命运
|
3月前
|
数据安全/隐私保护 计算机视觉 Python
一键生成眨眼照片app,一键生成眨眼照片,秒解人脸识别软件
这段代码使用了dlib的人脸检测和关键点定位功能来识别眼睛区域,然后通过图像处理技术模拟眨眼效果
|
11月前
|
负载均衡 Java API
项目中用的网关Gateway及SpringCloud
Spring Cloud Gateway 是一个功能强大、灵活易用的API网关解决方案。通过配置路由、过滤器、熔断器和限流等功能,可以有效地管理和保护微服务。本文详细介绍了Spring Cloud Gateway的基本概念、配置方法和实际应用,希望能帮助开发者更好地理解和使用这一工具。通过合理使用Spring Cloud Gateway,可以显著提升微服务架构的健壮性和可维护性。
556 0
|
JavaScript 前端开发
JavaScript 中运算符优先级:理解规则、实战应用与进阶技巧
【4月更文挑战第6天】了解 JavaScript 运算符优先级是编写清晰无误代码的关键。优先级规则决定了运算的顺序,从高到低包括一元、乘性、加性、关系、相等性等运算符。掌握优先级能避免逻辑错误,例如在表达式 `a * b + c` 中,乘法先于加法执行。实际应用中,使用括号可以明确运算顺序,提高代码可读性。注意避免混淆优先级,如赋值与比较操作。利用优先级简化逻辑判断,遵循编码规范,提升编程技能。通过不断学习和实践,加深对运算符优先级的理解,优化代码质量。
371 0
|
算法 5G 测试技术
5G的功能架构和灵活性 | 《5G移动无线通信技术》之十二
本节首先介绍了5G的高级要求又介绍了5G的功能架构和其灵活运用的性能。
5G的功能架构和灵活性 | 《5G移动无线通信技术》之十二
|
开发工具 git
STM32:定时器定时中断软件篇(内含:1.实验现象+2.代码编写思路+3.代码部分+4.定时器常用库函数详解)
STM32:定时器定时中断软件篇(内含:1.实验现象+2.代码编写思路+3.代码部分+4.定时器常用库函数详解)
799 0
STM32:定时器定时中断软件篇(内含:1.实验现象+2.代码编写思路+3.代码部分+4.定时器常用库函数详解)
|
C#
WPF 创建无边框的圆角窗口
原文:WPF 创建无边框的圆角窗口 如题所述,在WPF中要创建一个没有边框且为圆角的窗体,有如下几步工作要进行: 第一步:去掉窗体默认样式的边框 首先将窗体的背景设为透明,将允许透明的属性设置为True,...
2853 0
|
数据采集 API
使用【阿里云】API接口进行手机号(三网)实名认证
如今随着互联网产业的多元化发展,尤其是互联网金融,O2O,共享经济等新兴商业形式的兴起,企业对实名认证业务的数据形式和数据质量有了更高的需求。如今也衍生出手机号实名认证业务,通过接口将手机号、身份证号码、姓名上传至阿里云,再与运营商系统进行匹配,判断信息的一致性。
1002 0
使用【阿里云】API接口进行手机号(三网)实名认证
|
移动开发 开发框架 JavaScript
mPaas-H5容器与离线包介绍
mPaaS移动开发框架提供了一套完整的混合应用(Hybrid)开发解决方案,包括客户端的H5容器组件和服务端的离线包发布管理平台。 H5 Web应用的特点是开发效率高,但受制于Web技术和HTTP协议的限制,在移动端的表现差强人意。Native应用的优势在于性能,但是动态更新的能力较弱。Hybrid方案的出现正是为了调和这两者矛盾并发挥两者的优势,其核心技术能力包括:H5离线技术和JSBridge技术。简单来说,H5离线技术就是将HTML/CSS/JS和资源文件等打包提前下发到App中,使得App在加载H5应用时可以直接从本地读取资源文件,避免了大量的网络资源请求,从而提高H5应用的加载效率;
2530 0
mPaas-H5容器与离线包介绍