2015-06-26 128 views
2

爲了提供上下文,我對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); 
     } 
    } 
} 
+0

你說的*「但我不能確定這是否是正確的,因爲我不知道如何返回一個值,指出‘這是多少顯著數字意味着’。」 * ? – EZI

+1

有一個輸出到控制檯說「55535有5位有效數字」。還是我錯過了練習的要點? – Jon

+5

所以你可以編寫遞歸函數但不能使用'Console.WriteLine'?你確定它是**你的**代碼嗎? – EZI

回答

1

您需要Console.WriteLine()Main()方法來打印到控制檯。

通過您的電話dig()作爲Console.WriteLine的參數。

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

非常感謝,這讓我陷入困境。現在就開始工作了。 爲耐心而歡呼。 – Jon

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 
    } 
} 
+2

神祕downvoters在附近! – dotctor

+1

他們也投票刪除我的答案! upvoted for format string。 – dotctor

+2

upvoted for format string。 – dotctor

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