题目描述

判断一个正整数是否是快乐数字? 如果一个数字能够通过有限次快乐变换成为1,则是快乐数字。 快乐变换是对一个数字的每一位的平方数求和。
例如: 对于68

  • 68 => 6^2+8^2= 100
  • 100 =>1^2+0^2+0^2=1

所以68是一个快乐数字。

输入输出

输入

  • 第一行是n; 如果n为-1,表示输入结束

输出

  • 针对每组数据,输出是否是快乐数字 true/false

示例输入

68
-1

示例输出

true

题目分析

先来分析一下时间复杂度,对于给定的一个数,事先不知道会计算多少次,对于10^6的输入,最后变成810以内的数字的快乐变换,所以该题目的时间负责度为O(1)。
一个简单的解法:

#include <iostream>
#include <fstream>
#include <set>
using namespace std;class HappyNum {
public:bool isHappy(int n) {set<int> cache;while (cache.insert(n).second) n=transform(n); return n==1;}int transform(int n) {int result = 0;while (n != 0) {result += (n%10) * (n%10);n /= 10;}return result;}
};int main() {ifstream in("input.txt");string inNumStr;HappyNum ha;while (getline(in, inNumStr)) {int n = atoi(inNumStr.c_str());if (n != -1) {ha.isHappy(n) ? printf("true\n") : printf("false\n");}} in.close();return 0;
}

这是一个简单的实现方法,既然要做那就要做到极致,加入BigData的思维,如果这样的数字有成千上万个,每一个数字都要计算一次显然是不合理的,把cache变成全局变量,可以做进一步的优化。

#include <iostream>
#include <fstream>
#include <map>
using namespace std;map<int, bool> cache;class HappyNum {
public:bool isHappy(int n, int deep) {if (cache.find(n) != cache.end()) {printf("%d\n", deep);return cache[n];}cache[n] = false;cache[n] = isHappy(transform(n), deep+1);return cache[n];}int transform(int n) {int result = 0;while (n != 0) {result += (n%10) * (n%10);n /= 10;}return result;}
};int main() {ifstream in("input.txt");string inNumStr;HappyNum ha;cache[1] = true;while (getline(in, inNumStr)) {int n = atoi(inNumStr.c_str());if (n != -1) {ha.isHappy(n, 1) ? printf("true\n") : printf("false\n");}} in.close();return 0;
}

更进一步考虑这个问题,上述的实现中,使用了cache作缓存,将已经获得的结果记录下来,并且使用的递归调用,而对于大部分的数字,比如10位数9999999999,快乐变化为810,所以我们可以事先得到810以前的数字,然后再判断给定的数字,这样可以进一步优化缓存空间。

#include <iostream>
#include <fstream>
#include <map>
using namespace std;map<int, bool> cache;class HappyNum {
public:bool isHappy(int n, int deep) {if (cache.find(n) != cache.end()) {printf("%d\n", deep);return cache[n];}cache[n] = false;cache[n] = isHappy(transform(n), deep+1);return cache[n];}int transform(int n) {int result = 0;while (n != 0) {result += (n%10) * (n%10);n /= 10;}return result;}
};int main() {ifstream in("input.txt");string inNumStr;HappyNum ha;cache[1] = true;for (int i=0; i<=810; ++i) {ha.isHappy(i, 1);}while (getline(in, inNumStr)) {int n = atoi(inNumStr.c_str());if (n != -1) {ha.isHappy(n, 1) ? printf("true\n") : printf("false\n");}} in.close();return 0;
}

【001】快乐数字解题过程记录相关推荐

  1. sql-labs page1 (1~20)解题过程记录

    目录 Less1:(基于错误的GET单引号字符型注入) less 2:(GET型整型注入) less 3:(基于错误的GET单引号变形字符型注入) less 4:(基于错误的GET双引号字符型注入) ...

  2. sql-labs page2(21~38) 解题过程记录

    目录 less-21( 基于错误的复杂的字符型Cookie注入) less -22(基于错误的双引号字符型Cookie注入) less-23(基于错误的,过滤注释的GET型) less-24(二次注入 ...

  3. CV之IC之SpatialTransformer:基于ClutteredMNIST手写数字图片数据集分别利用CNN_Init、ST_CNN算法(CNN+ST)实现多分类预测案例训练过程记录

    CV之IC之SpatialTransformer:基于ClutteredMNIST手写数字图片数据集分别利用CNN_Init.ST_CNN算法(CNN+ST)实现多分类预测案例训练过程记录 目录 基于 ...

  4. 逆向查找_CTFer成长之路--一道数独逆向题目解题过程(算法分析、查找线索)...

    前言 CTF 是实战性很强的赛事.仅学习理论知识,不进行实操,永远无法成为 CTF 大神.本次博客为大家解读一道数独相关的逆向,讲解解题过程,总结知识点(CTF中的套路). 题目介绍 本次选择的是出自 ...

  5. 结对编程项目的过程记录与收获

    结对编程项目的过程记录与收获 1.编程问题 某公司程序员二柱的小孩上了小学二年级,老师让家长每天出100道(100以内)四则运算题目给小学生做. 2.结对编程的出发点 为了体会结对编程的好处,和同伴一 ...

  6. win10--vs2015--libjpeg--64位库的编译过程记录

    win10--vs2015--libjpeg--64位库的编译过程记录 1. 下载源代码:   http://libjpeg.sourceforge.net/    或者  http://www.ij ...

  7. 一卡通(M1卡)破解过程记录——理论篇

    前些日子在研究学校的一卡通安全,在此记录一下一卡通破解的全过程,仅用作学习交流,切勿用于违法用途 其他几篇: 一卡通(M1卡)破解过程记录--准备篇              获取扇区密钥      ...

  8. 解决Linux 负载过高问题过程记录

    解决问题的思路 1.top命令查看该机器的负载状况 2.cd  /proc/pid 查看对应高占用程序的位置 3.进入对应程序中查看日志,根据CPU和内存这两个因素分析 4.ps -ajxf 查看进程 ...

  9. bugku上Snowfall解题过程

    MISC的Snowfall解题过程: 刚看到打开人直接傻掉,翻译一下暴风雪???什么鬼题,有没有一样这样想的 1:先看两个txt名字,告诉了步骤1,步2,所以肯定这个有用,给个网站: Whitelip ...

  10. 超级简单分享:快乐数字

    天热超级简单分享:快乐数字 介绍 方法 算法设计 算法分析 介绍 快乐数字是指一个自然数n中的每一位数字的平方和为1或以每一位数字的平方和的结果为新的自然数继续计算平方和直到平方和为1.由于约束条件为 ...

最新文章

  1. ThroughRain第一次冲刺(每天更新)
  2. 假期宣言2018-01-10
  3. 设计模式笔记15:代理模式(Proxy Pattern)
  4. jQuery_事件学习
  5. OpenBSD 将迎来原生的 Hypervisor
  6. 注意!恶意NPM包正在安装勒索软件和密码窃取木马
  7. 【leetcode】数组的度-两个map关联初探
  8. 【UKIEPC2017:F题】Flipping Coins(抛硬币求正面朝上个数的期望----概率dp)
  9. 关于"舆情监测"关键词在百度搜索中的相关数分析
  10. kell Vision5有那些使用技巧呢
  11. es服务器的cpu压力过大的调试
  12. excel 度分秒转度
  13. PHP8.0正式版的编译安装与使用
  14. CentOS7.4安装ClamAV反病毒软件
  15. Cortana与应用程序的后台交互
  16. 文件被占用无法删除,解决办法
  17. TYPEC 接口芯片CC逻辑原理与必要性
  18. 廖雪峰讲python高阶函数求导_廖雪峰python课程笔记
  19. c语言中百分号后面跟的数字_C语言中的各种百分号都代表什么意思
  20. 查询MIMIC-III

热门文章

  1. android自定义系统屏保Dream
  2. jupyter报错EnvironmentLocationNotFound: Not a conda environment: /root/anaconda3/envs/anaconda3
  3. 友情链接对网站优化有什么作用
  4. 【冷冻电镜|论文阅读】A feature-guided, focused 3D signal permutation method for subtomogram averaging
  5. 【转】Windows10彻底关闭休眠功能
  6. Excel的一些实用函数(if函数,vlookup函数,match函数)
  7. tc的linux命令详解,linux tc命令详解
  8. 解密灰鸽子木马帝国【实在是恐怖呀】
  9. 【牛客网-前端笔试题】——vue专项练习
  10. 为什么四大文明古国到现在只剩中国了