快乐号码输出

时间:2016-01-28 13:18:17

标签: c#

我正在做一个快乐的号码练习。仅供参考https://en.wikipedia.org/wiki/Happy_number 这是我的代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication23
{
    class Program
    {
        static void Main(string[] args)
        {
            List<string> happynum = new List<string>();
            Program test = new Program();
            string number = "7";
            if (test.CheckHappy(number))
            {
                happynum.Add(number);
            }

            if (happynum.Contains(number))
            {
                Console.WriteLine("1");
            }
            else
            {
                Console.WriteLine("0");
            }

        }
        public bool CheckHappy(string num) {
            int sum = 0;
            int temp = int.Parse(num);
            while (temp != 1) {
                while (temp != 0)
                {
                    int digit = temp % 10;
                    sum += digit * digit;
                    temp = temp / 10;
                }
                temp = sum;
                sum = 0;
            }
            return true;
        }
    }
}

当我把&#34; true&#34;快乐的数字,如7,1,控制台打印1,但当我把22,435这样的东西,它不打印0 请帮忙!!!

4 个答案:

答案 0 :(得分:0)

根据Wiki,如果数字不满意,算法将在一个不包含1的循环中无休止地循环。所以基本上它永远不会打印0,因为你陷入无限循环。但是,当算法以重复数字的循环结束时,此循环始终包含数字4,因此当数字不满时,您只需添加另一个if语句来终止while循环。

while (temp != 0)
{
    int digit = temp % 10;
    sum += digit * digit;
    temp = temp / 10;

    //You need this to stop the infinite loop 
    if (sum == 4)
          return false;
}

答案 1 :(得分:0)

以下是找到快乐或悲伤号码的逻辑:

public static string HappyOrSad(string input, char[] arr)
    {
        int result = 0;
        // Hashset to store ouput of each loop
        HashSet<int> repNumber = new HashSet<int>();

        // If number is repeated, break the loop
        while (!repNumber.Contains(result) )
        {
            int temp = 0;
            repNumber.Add(result);
            for (int i = 0; i < arr.Length; i++)
            {
                // Converting character array to integer
                temp += Convert.ToInt32(arr[i].ToString()) * Convert.ToInt32(arr[i].ToString());
            }                
            arr = temp.ToString().ToCharArray();
            result = temp;                
        }

        return result == 1 ? "Happy" : "Sad";
    }

此处有完整的计划:http://aravin.net/csharp-program-find-happy-sad-number/

答案 2 :(得分:0)

如果给定数字为快乐数字,则此方法将返回true,否则将返回false。我们在这里使用set来避免无限循环的情况。

输入:19

输出:true

说明:

1 * 1 + 9 * 9 = 82

8 * 8 + 2 * 2 = 68

6 * 6 + 8 * 8 = 100

1 * 1 + 0 * 0 + 0 * 0 = 1

     public static boolean isHappy(int n) {

          Set<Integer> seen = new HashSet<Integer>();

          while(n != 1) {
            int current = n;
            int sum = 0;
            while(current != 0) {
                sum += (current % 10) * (current % 10);
                current /= 10;
            }

            if(seen.contains(sum)) {
                return false;
            }

            seen.add(sum);
            n = sum;
        }

        return true;

    }

答案 3 :(得分:0)

我有一个类似的python解决方案,具有O(n)的时间复杂度。我使用过python,但是该算法将帮助您理解这一点。 我已经使用递归来执行此操作。

算法:

  1. 使用变量求和所有存在于num中的数字
  2. 浏览数字的位数,然后求和所有位数的平方
  3. 现在将总和数据添加到被测数字本身
  4. 如果数字等于1,则返回true;如果数字等于4,则返回false
  5. 否则,通过传递具有求和数据的数字来再次调用该函数

代码:

def isHappy(num: int) -> bool:
   digitSum = 0

   for i in str(num):
     # This sums up the squared of the digit
     digitSum += pow(int(i),2)

   # now pass the digitSum to the num variable itself
   num = digitSum

   if num == 1: return True
   elif num == 4: return False
   else: return isHappy(num)

希望这会在更大程度上帮助您。如果没有代码,则为算法。感谢Alex对您的算法帮助。节省了很多时间