用于寻找幸福数字的Leetcode算法练习

时间:2018-01-31 21:31:15

标签: c++ algorithm recursion

背景

此问题来自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。

1 个答案:

答案 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;
}

希望这有帮助!