Возвращает неверный вывод

Описание вызова:

Пусть функция KaprekarsConstant(num) принимает передаваемый параметр num, который будет четырехзначным числом, состоящим как минимум из двух различных цифр.

Ваша программа должна выполнять следующую процедуру над числом:

  • Расположите цифры в порядке убывания и в порядке возрастания (добавляя нули, чтобы подогнать его к 4-значному числу), и вычесть меньшее число от большего числа. Затем повторите предыдущий шаг.
  • Выполнение этой процедуры всегда приведет к тому, что вы достигнете фиксированного числа: 6174.
  • Тогда выполнение подпрограммы на 6174 всегда даст вам 6174 (7641 - 1467 = 6174). Ваша программа должна возвращать количество раз, которое эта процедура должна быть выполнена, пока не будет достигнуто 6174.

Например: если num равно 3524, ваша программа должна вернуть 3 из-за следующих шагов:

  1. 5432 - 2345 = 3087
  2. 8730 - 0378 = 8352
  3. 8532 - 2358 = 6174

Веб-сайт, на котором я принял этот вызов Coderbyte

Проблема :

Все работает корректно, пока не вернет результат в Foo() Не знаю почему, но она вызывает эту функцию несколько раз, пока Count==2

Пожалуйста, помогите. Извините, пожалуйста, если я сделал ошибки, и мой код действительно плохой, потому что я школьник (9 класс) и я программирую в течение полугода

using System;

class MainClass
{ 
    public static int Foo(int num,int Counter)
    {
        int Count = Counter;
        int[] arr = new int[4];
        arr[0] = num / 1000;
        arr[1] = num % 10;
        arr[2] = (num / 100) % 10;
        arr[3] = (num % 100) / 10;
        Array.Sort(arr);
        int[] AscArr = new int[4];
        arr.CopyTo(AscArr, 0);
        Array.Reverse(arr);
        int[] DescArr = arr;
        int sub = 0;
        string AscStr = string.Empty;
        string DescStr = string.Empty;
        for (int i = 0; i < AscArr.Length; i++)
        {
            AscStr += AscArr[i];
        }
        for (int i = 0; i < DescArr.Length; i++)
        {
            DescStr += DescArr[i];
        }
        int b = int.Parse(AscStr);
        int a = int.Parse(DescStr);
        sub = a - b;

        if (sub!=6174)
        {
            Count++;
            Foo(sub,Count);
        }
        if (sub==6174)
        {
            Count++;


        }

        return Count;

    }
    public static int KaprekarsConstant(int num)
    {
        int[] arr=new int[4];
        arr[0] = num / 1000;
        arr[1] = num % 10;
        arr[2] = (num / 100) % 10;
        arr[3] = (num % 100) / 10;
        Array.Sort(arr);
        int[] AscArr=new int[4];
        arr.CopyTo(AscArr,0);
        Array.Reverse(arr);
        int[] DescArr = arr;
        int sub = 0 ;
        string AscStr=string.Empty;
        string DescStr = string.Empty;
        for (int i = 0; i < AscArr.Length; i++)
        {
            AscStr += AscArr[i];
        }
        for (int i = 0; i < DescArr.Length; i++)
        {
            DescStr += DescArr[i];
        }
        int b = int.Parse(AscStr);
        int a = int.Parse(DescStr);
        sub = a - b;
        int Counter =1;
        int Count=0;
        if (Count!=6174)
        {
            Count = Foo(sub, Counter);
        }



        return Count;

    }

    static void Main()
    {
        // keep this function call here
        Console.WriteLine(KaprekarsConstant(int.Parse(Console.ReadLine())));
    }

}

Добро пожаловать в переполнение стека. Это не плохой вопрос, просто были некоторые проблемы с форматированием

Cleptus 24.04.2019 17:00
Рекурсия
Jimi 24.04.2019 17:03

Также вместо рекурсии можно сделать цикл: while (num != 6174) ....

user2956272 24.04.2019 17:14
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
107
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш код слишком сложен, плюс ваш способ деления числа на array дает неправильные результаты.

// this is wrong you can print array, the numbers goes into wrong indexes 
arr[0] = num / 1000;
arr[1] = num % 10;
arr[2] = (num / 100) % 10;
arr[3] = (num % 100) / 10;

Использовать этот:

using System;
class MainClass
{ 
    public static int count = 0;
    public static void KaprekarsConstant(int num)
    {
        if (num == 6174)  // base case
            return;
        count++;

        string[] Aarr=new string[4];
        string[] Darr = new string[4];
        string asc = "", dsc = "";

        Aarr[3] = (num % 10).ToString();
        Darr[3] = (num % 10).ToString();
        num /= 10;
        Aarr[2] =(num % 10).ToString();
        Darr[2] = (num % 10).ToString();
        num /= 10;
        Aarr[1] = (num % 10).ToString();
        Darr[1] = (num % 10).ToString();
        num /= 10;
        Aarr[0] =(num % 10).ToString();
        Darr[0] = (num % 10).ToString();

        Array.Sort(Aarr);  // ascneding sorted
        Array.Sort<string>(Darr, new Comparison<string>( (i1, i2) => i2.CompareTo(i1)));   // descending sorted

        for(int i = 0; i< 4;i++)
        {
            asc += Aarr[i];
            dsc += Darr[i];
        }
        KaprekarsConstant(Convert.ToInt32(dsc) -Convert.ToInt32(asc) );
}

    static void Main()
    {
        KaprekarsConstant(int.Parse(Console.ReadLine()));
        Console.WriteLine("\nIt took "+count + "times to reach 6174");
    }
}

Это не лучший подход, но он работает правильно, ха-ха :-)

Zain Arshad 24.04.2019 18:59

Прочитайте проблему

Zain Arshad 24.04.2019 19:07

В нем говорится, что «число должно состоять как минимум из 2 разных цифр».

Zain Arshad 24.04.2019 19:08

Другие вопросы по теме