忙并快乐着

天气又开始变的阴沉了,似乎有了那段杀到上海一个礼拜的日子,各种的滋味只有闲暇时候才可以想起.

来公司也2个礼拜多了,因为在发展期,见到了人到来,也见到了人的离开,14天里面13天都在公司度过,学习了点东西, 不过远比以前少的多,需要调整调整了,想的事情太多,前几天精神真的相当的疲劳.这几天让自己多睡个半小时吧.

一个人在外面的生活,需要独自做的事情太多了,开始的时候很多事情只能马虎一些了,希望等money到手后会好一些,还是要努力早些融入公司开发中去,然后继续努力提高,当然还是要用时间来体会下生活的乐趣~ :D
### 快乐数的判断算法 快乐数的判断主要依赖于一个过程:将一个正整数替换为它各个位上数字的平方和,然后重复这个过程。如果最终结果变为 1,则该数是快乐数;否则,如果进入无限循环且始终变不到 1,则不是快乐数。 在实现中,为了避免无限循环,通常采用一个集合来记录已经出现过的数字。如果某个数字再次出现,则说明进入了循环,可以提前终止程序返回 `false`。 以下是一个基于上述逻辑的 C++ 实现: ```cpp #include <iostream> #include <unordered_set> using namespace std; int getNext(int n) { int totalSum = 0; while (n > 0) { int d = n % 10; n = n / 10; totalSum += d * d; } return totalSum; } bool isHappy(int n) { unordered_set<int> seen; while (n != 1 && seen.find(n) == seen.end()) { seen.insert(n); n = getNext(n); } return n == 1; } int main() { int num; cout << "请输入一个正整数:"; cin >> num; if (isHappy(num)) { cout << num << " 是快乐数。" << endl; } else { cout << num << " 不是快乐数。" << endl; } return 0; } ``` ### 代码说明 1. **`getNext` 函数**: - 此函数用于计算给定数字 `n` 的各位数字的平方和。 - 使用 `n % 10` 提取最后一位数字,然后更新 `n = n / 10`,直到 `n` 变为 0。 - 所有平方值相加后返回结果。 2. **`isHappy` 函数**: - 使用 `unordered_set<int>` 来存储已经出现过的数字,以检测循环。 - 如果 `n` 变为 1,则返回 `true`,表示是快乐数。 - 如果 `n` 已经出现在集合中,则说明进入无限循环,返回 `false`。 3. **主函数 `main`**: - 从用户输入中读取一个整数,调用 `isHappy` 函数判断是否为快乐数。 - 输出相应的结果。 ### 算法复杂度分析 - **时间复杂度**:假设最坏情况下,数字会在一个循环中不断变化,但根据数学推导,所有非快乐数最终都会进入循环。因此,时间复杂度是有限的,具体取决于数字的变化路径。 - **空间复杂度**:由于使用了哈希集合来存储已经出现过的数字,空间复杂度为 $O(k)$,其中 $k$ 是循环中不同数字的数量。 ### 其他实现方式 除了使用哈希集合来检测循环,也可以使用快慢指针法(Floyd Cycle Detection Algorithm)来判断是否进入循环。这种方法不需要额外的空间来存储所有出现过的数字[^4]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值