c# - 如何检测数字的持久性何时达到一位数

标签 c# function while-loop persistence do-while

我正在尝试创建一个返回数字持久性的函数,我认为主要问题是底部的 do while 循环,我不知道如何让它检测到只有一个数字。目标是使用嵌套函数进行迭代,并在每次迭代时增加计数,直到 n 等于一位数字。计数是数字持久性,这是您必须将 num 中的数字相乘直到达到一位数的次数。我期望 3 但我得到的是 2 的值。

    class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(Persist.Persistence(39));
        Console.ReadLine();
    }
}

public class Persist
{
    public static int Persistence(long n)
    {
        int count = 0;
        if (n.ToString().Length == 1)
        {
            return count;
        }

        count = 1;
        //break up each number in the long individually.
        List<long> listofLong = new List<long>();
        while (n > 0)
        {
            listofLong.Add(n % 10);
            n = n / 10;
        }

        //First iteration of each number mult each other in list
        long calculate(List<long> seperatedNums)
        {
            long mult = 1;
            for (int i = 0; i < seperatedNums.Count; i++)
                mult *= seperatedNums[i];
            return (int)mult;
        }


        do
        {
            calculate(listofLong);
            count++;
        } while ((Math.Floor(Math.Log10(n)) + 1) > 1);

        return count;
    }
}

最佳答案

好吧,个位数表示0..9范围;这就是为什么它应该是 n > 9 或类似的条件:

public static int Persistence(long n) {
  if (n < 0)
    throw new ArgumentOutOfRangeException(nameof(n));

  while (n > 9) {          // beyond a single digit
    long s = 1;

    for (; n > 0; n /= 10) // multiply all the digits
      s *= n % 10;

    n = s;
  }

  return (int)n;
}

测试:

// 2178 -> 2 * 7 * 1 * 8 = 112 -> 1 * 1 * 2 = 2
Console.Write(Persistence(2718));

如果我们想计算循环:

public static int Persistence(long n) {
  if (n < 0)
    throw new ArgumentOutOfRangeException(nameof(n));

  int loops = 0;

  while (n > 9) {          // beyond a single digit
    long s = 1;

    for (; n > 0; n /= 10) // multiply all the digits
      s *= n % 10;

    n = s;
    loops += 1;
  }

  return loops;
}

测试:

// we have 3 steps here (39 -> 27 -> 14 -> 4): 
// 39 -> 3 * 9 = 27 -> 2 * 7 = 14 -> 1 * 4 = 4 
Console.Write(Persistence(39));

关于c# - 如何检测数字的持久性何时达到一位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54142397/

相关文章:

java - While 循环创建永无止境的输入循环

c++ - 了解 C++ 程序 [ Bjarne Stroustrup 的书 ]

c# - 如何通过单击访问单例变量而不导致 NullReferenceException

c# - 不会为动态创建的复选框调用事件处理程序

c# - Microsoft.ApplicationInsights 错误 : InstrumentationKey cannot be empty

c++ - 有人可以解释以下奇怪的函数声明吗?

c++ - 如何阻止它无限重复,但仍保持循环?

c# - ASP.NET Web API DELETE 方法错误

MySql 函数

c++ - 无法在 C++ 中调用 const 引用参数的方法