我正在做一个快乐的号码练习。仅供参考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 请帮忙!!!
答案 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,但是该算法将帮助您理解这一点。
我已经使用递归来执行此操作。
算法:
- 使用变量求和所有存在于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)
希望这会在更大程度上帮助您。如果没有代码,则为算法。感谢Alex对您的算法帮助。节省了很多时间