快乐的数字放

本文关键字:快乐的数字 | 更新日期: 2023-09-27 18:32:13

我正在做一个快乐的数字练习。仅供参考 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;
        }
    }
}
当我输入

一个"真正的"快乐数字,如 7、1,控制台打印 1,但当我输入 22, 435 之类的东西时,它不会打印 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;
}

以下是查找快乐或悲伤数字的逻辑:

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/

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

输入: 19

输出:真

解释:

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

我有一个类似的 python 解决方案,具有O(n)时间复杂度。我用过python,但算法会帮助你得到这个想法。我使用递归来执行此操作。

算法:

  1. 取变量对 num 中存在的所有数字进行求和
  2. 遍历数字的数字,并对所有数字进行平方求和
  3. 现在将总和数据添加到测试数字本身
  4. 如果数字等于
  5. 1,则返回 true,如果数字等于 4,则返回 false
  6. 否则再次调用该函数,通过传递具有总和数据的数字

法典:

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)

希望这会在更大程度上帮助你。如果不是代码,那么算法。感谢亚历克斯的出色算法帮助。节省了大量时间