Как определить, когда постоянство числа достигает одной цифры - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь создать функцию, которая возвращает постоянство числа, основной проблемой, на мой взгляд, является цикл 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;
    }
}

}

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Это должен быть самый глупый код, написанный за некоторое время

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

Или больше OCD для печати символов махинации

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);
}
0 голосов
/ 11 января 2019

Ну, одна цифра означает 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));

В случае, если мы хотим считать 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));
...