背景
此问题来自leetcode.com
编写一个算法来确定一个数字是否为#34;快乐"。
幸福数字是由以下过程定义的数字:从任何正整数开始,将数字替换为其数字的平方和,并重复该过程,直到数字等于1(它将保留的位置),或者它在一个不包括1的循环中无休止地循环。这个过程以1结尾的那些数字是幸福的数字。
示例:19是一个快乐的数字
1 ^ 2 + 9 ^ 2 = 82
8 ^ 2 + 2 ^ 2 = 68
6 ^ 2 + 8 ^ 2 = 100
1 ^ 2 + 0 ^ 2 + 0 ^ 2 = 1
问题:
我想为这个特殊问题做一个递归,继续重复整数的平方,直到我们到达1.我是递归的新手(刚读完Absolute C ++ Ch 13 ---昨天的递归)。我想我会的给这个问题一个机会,但我遇到了一些麻烦。
当我调用我创建的函数时,我应该返回19,因为19是#34; Happy Number",而是我的函数只返回0,我不知道为什么。我只需要对我采取的方法提出一些帮助,并建议改变我的代码。
这是我的代码:
#include <algorithm>
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
int Happy(int n) {
vector<int> nums;
int length = to_string(n).length();
for(int i = 0; i < length; i++) {
int digit = n % 10;
n /= 10;
nums.push_back(digit);
}
reverse(nums.begin(), nums.end());
int sum = 0;
for(int i = 0; i < length; i++) {
sum += pow(nums[i],2);
}
if (sum == 1) {
return n;
}
else {
return Happy(sum);
}
}
int main() {
int n = 19;
int result = Happy(n);
cout << result << endl;
return 0;
}
同样,我不知道为什么我得到0作为结果,它应该返回19。
答案 0 :(得分:3)
您忘记在代码中放置一个返回,并且您变为0
,并且当您找到sum == 1
时返回n。它应该返回original_num
。
要存储原始数字参考号,请将其与您对happy方法的调用一起传递。
#include <algorithm>
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
int Happy(int n, int original_num) {
vector<int> nums;
int length = to_string(n).length();
for(int i = 0; i < length; i++) {
int digit = n % 10;
n /= 10;
nums.push_back(digit);
}
//reverse(nums.begin(), nums.end());
int sum = 0;
for(int i = 0; i < length; i++) {
sum += nums[i]*nums[i];
}
if (sum == 1) {
return original_num;
}
else {
return Happy(sum, original_num);
}
}
int main() {
int n = 19;
int result = Happy(n, n);
cout << result << endl;
return 0;
}
希望这有帮助!