【问题标题】:Returns incorrect output返回不正确的输出
【发布时间】:2019-04-24 14:47:09
【问题描述】:

挑战描述:

让函数 KaprekarsConstant(num) 接受传递的 num 参数,该参数将是一个至少有两个不同数字的 4 位数字。

你的程序应该对数字执行以下例程:

  • 按降序和升序排列数字(添加 零以使其适合 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())));
    }

}

【问题讨论】:

  • 欢迎堆栈溢出。这不是一个坏问题,只是有一些格式问题
  • 另外,你可以创建一个循环而不是递归:while (num != 6174) ....

标签: c#


【解决方案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");
    }
}

【讨论】:

  • 这不是最好的方法之一,但它运行正确哈哈 :-)
  • 阅读问题
  • 它声明“数字应该至少有 2 个不同的数字”
猜你喜欢
  • 1970-01-01
  • 2017-10-01
  • 2020-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-13
  • 1970-01-01
相关资源
最近更新 更多