为了提供上下文,我对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 :(得分: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);
}
}