【发布时间】:2019-04-24 14:47:09
【问题描述】:
挑战描述:
让函数 KaprekarsConstant(num) 接受传递的 num 参数,该参数将是一个至少有两个不同数字的 4 位数字。
你的程序应该对数字执行以下例程:
- 按降序和升序排列数字(添加 零以使其适合 4 位数字),并减去较小的 大数中的数。然后重复上一步。
- 执行此例程将始终使您达到一个固定数字:6174。
- 然后在 6174 上执行例程将始终为您提供 6174 (7641 - 1467 = 6174)。 您的程序应返回此例程必须执行的次数,直到达到 6174。
例如:如果 num 是 3524,您的程序应该返回 3,因为以下步骤:
- 5432 - 2345 = 3087
- 8730 - 0378 = 8352
- 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#