快乐的数字放
本文关键字:快乐的数字 | 更新日期: 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,但算法会帮助你得到这个想法。我使用递归来执行此操作。
算法:
- 取变量对 num 中存在的所有数字进行求和
- 遍历数字的数字,并对所有数字进行平方求和
- 现在将总和数据添加到测试数字本身
如果数字等于- 1,则返回 true,如果数字等于 4,则返回 false
- 否则再次调用该函数,通过传递具有总和数据的数字
法典:
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)
希望这会在更大程度上帮助你。如果不是代码,那么算法。感谢亚历克斯的出色算法帮助。节省了大量时间