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

Posted

技术标签:

【中文标题】如何检测数字的持久性何时达到一位【英文标题】:How to detect when a persistence of a number reaches one digit 【发布时间】:2019-06-06 03:10:33 【问题描述】:

我正在尝试创建一个返回数字持久性的函数,我认为主要问题是我在底部的 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 &lt;= 9? 这导致了无限循环。 【参考方案1】:

嗯,个位数表示0..9范围;这就是为什么它应该是n &gt; 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));

如果我们要数loops

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

【讨论】:

这是加法持久性,OP似乎想要乘法持久性。 @InBetween:我明白了;如果是乘法持久性,则需要进行少量编辑。 这是最佳答案+1【参考方案2】:

这一定是一段时间以来最愚蠢的代码

public static long Persistence(long n)

   var i = 0;
   for (var s = n; s > 9; i++)
      do s *= n % 10; while ((n = n / 10) > 0);
   return i;

或者更多可打印字符强迫症恶作剧

public static void Persistence(long n, ref long r)

   for (long s = n, i = 0; s > 9; r= ++i)
       do s *= n % 10; while ((n = n / 10) > 0);

【讨论】:

@JeffreyPadgett 我只是想删除线条和字符,完全不可读 我写的代码?还是你自己的代码?对不起,如果我的不好。我是一名努力变得更好的学生。 您可以将i 作为参数传递:还有另一行:)

以上是关于如何检测数字的持久性何时达到一位的主要内容,如果未能解决你的问题,请参考以下文章

建议使用较短且正确的版本来改进我的长python代码

在 Spark 中何时持久化以及何时取消持久化 RDD

何时在 Java 消息传递和队列系统中使用持久性

如何检测我的 Django 对象 DateTimeField 何时达到当前时间

RabbitMQ 如何决定何时删除消息?

JPA - 持久化对象时何时使用 getTransaction()