计算整数中的有效数字

时间:2015-06-26 22:01:24

标签: c# .net recursion

为了提供上下文,我对C#非常陌生,目前我正在通过Wiley的软件开发基础工作。问题如下:

  

您正在为您的应用程序开发实用程序函数库。您需要编写一个采用整数的方法并计算其中的有效位数。您需要创建一个递归程序来解决问题。你会怎么写这样的节目?。

我想我已经为这个问题创建了一个解决方案,但我不确定这是否正确,因为我不知道如何返回一个值“这是多少有效数字”

class Program
{
    public static void Main(string[] args)
    {
        dig(55535);
    }
    public static int dig(int x)
    {
        if (x < 10)
        {
            return 1;
        }
        else
        {
            return 1 + dig(x / 10);
        }
    }
}

6 个答案:

答案 0 :(得分:2)

您应该更改Main函数并使用Console.WriteLine将结果写入输出窗口。

public static void Main(string[] args)
{
    // storing the return value of the function in to a variable
    int result = dig(55535); 

    //print the variable
    Console.WriteLine(result);

    //or call Console.WriteLine(dig(55535));
}

答案 1 :(得分:1)

您需要Console.WriteLine()方法中的Main()才能打印到控制台。

将来电dig()作为参数传递给Console.WriteLine

答案 2 :(得分:0)

class Program
{
    public static void Main(string[] args)
    {
        int value = 55535;
        Console.WriteLine("Number {0} has {1} significant digits", value, dig(value));
    }
    public static int dig(int x)
    {
        // Exactly as you have it
    }
}

答案 3 :(得分:0)

虽然答案如“查看调试器中的返回值”或

Console.WriteLine("Number {0} has {1} significant digits", value, dig(value));

将回答你提出的问题,这对未来不是一个好策略。让一个人检查单个变量的单个输出可能是可行的,但这不会扩展到涉及数百(或数千)具有数千(或数十亿)可能返回值的函数的项目。

最终你必须实施automated tests;这是计算机测试输出的地方,并在出现问题时提醒您。

主题很大,但你可以实现一个简单的例子:

public static void Main(string[] args
{
    var tests = new []
    {
        new []{0, 1},
        new []{1, 1},
        new []{10, 2},
        new []{100, 3}
    };

    foreach (var p in tests)
        if (dig(p[0]) != p[1]) Console.WriteLine("dig({0}) == {1}", p[0], p[1]);
}

答案 4 :(得分:0)

这不使用递归,但是对于计算数字中有效数字的更一般情况的解决方案。这使用宽松的规则,因为在处理非字符串时,无法知道小数点后有多少尾随零。

public int CountSignificantDigits(decimal num)
{
    if (num == 0) return 1;
    if (num < 0) num = -num;
    while (num < 1m) num *= 10;
    string numStr = num.ToString().Replace(".","");
    for (int i = numStr.Length-1; i > 0; i--)
    {
        if (numStr[i] != '0')
            return numStr.Length - (numStr.Length - i) + 1;
    }
    return 1;
}

答案 5 :(得分:0)

或许已经注意到,原始代码不考虑整数尾随零。这可能是另一种方法。

static void Main(string[] args)
{
    do
    {
            Console.Write("Number = ");
            int number = Int32.Parse(Console.ReadLine());
            int abs_number = Math.Abs(number);

            int numTrailingZeros = 0;
            bool check_ntz = true;

            int ndigits = GetSignificantDigits(abs_number, ref check_ntz, ref numTrailingZeros);

            if (numTrailingZeros == 0)
                Console.WriteLine("Number of signficant figures: {0}", ndigits);
            else
                Console.WriteLine("Number of signficant figures: between {0} and {1}", ndigits, ndigits + numTrailingZeros);

            Console.WriteLine();
            Console.WriteLine("Press ESC to terminate, any other to continue.");
            Console.WriteLine();
    }
    while (Console.ReadKey(true).Key != ConsoleKey.Escape);
    return;
}

static int GetSignificantDigits(int n, ref bool check_ntz, ref int ntz)
{
    if (n < 10)
        return 1;
    else
    {
        int new_n = (int)(n / 10);

        if (check_ntz)
        {
            if (n % 10 == 0)
            {
                ntz++;
                return GetSignificantDigits(new_n, ref check_ntz, ref ntz);
            }
            else
            {
                check_ntz = false;
                return 1 + GetSignificantDigits(new_n, ref check_ntz, ref ntz);
            }
        }
        else
            return 1 + GetSignificantDigits(new_n, ref check_ntz, ref ntz);
    }
}

enter image description here