你如何在 c# 中以 surd 形式留下根?
How do you leave roots in surd form in c#?
例子a: √12 =2√3
例b:√16=4
我正在尝试两者兼得。
虽然我当然可以使用 Math.Sqrt(4)
来实现结果 b,但我不知道如何实现 a ,或进一步如何让两者同时工作,这是目标。我如何在 C# 中实现这种类型的简化?
我尝试了几个库,包括 MathNet、Symbolics 和 NCalc,但都没有成功。
This post 可能已经用 c++ 解决了,虽然我不确定。我尝试转换该解决方案以查看它是否有效的尝试非常失败:
var outside_root = 1;
var inside_root = 800;
var d = 2;
while (d * d <= inside_root)
if (inside_root % (d * d) == 0) //# inside_root evenly divisible by d * d
{
inside_root = inside_root / (d * d);
outside_root = (outside_root * d);
}
while (d * d > inside_root) {
d = (d + 1);}
感谢您的帮助
可以将给定的 C++ 翻译成 C#,而无需进行大量更改。还可以对原始算法进行一些修改,以减少乘法次数并提高整体性能:
static (int, int) Sqrt2(int n)
{
int m = 1, d = 2;
int dSquared;
while ((dSquared = d * d) <= n)
{
while ((n % dSquared) == 0)
{
n /= dSquared;
m *= d;
}
d++;
}
return (m, n);
}
static void Main(string[] args)
{
Console.WriteLine(Sqrt2(12)); // prints (2, 3)
Console.WriteLine(Sqrt2(16)); // prints (4, 1)
Console.WriteLine(Sqrt2(13)); // prints (1, 13)
}
例子a: √12 =2√3
例b:√16=4
我正在尝试两者兼得。
虽然我当然可以使用 Math.Sqrt(4)
来实现结果 b,但我不知道如何实现 a ,或进一步如何让两者同时工作,这是目标。我如何在 C# 中实现这种类型的简化?
我尝试了几个库,包括 MathNet、Symbolics 和 NCalc,但都没有成功。 This post 可能已经用 c++ 解决了,虽然我不确定。我尝试转换该解决方案以查看它是否有效的尝试非常失败:
var outside_root = 1;
var inside_root = 800;
var d = 2;
while (d * d <= inside_root)
if (inside_root % (d * d) == 0) //# inside_root evenly divisible by d * d
{
inside_root = inside_root / (d * d);
outside_root = (outside_root * d);
}
while (d * d > inside_root) {
d = (d + 1);}
感谢您的帮助
可以将给定的 C++ 翻译成 C#,而无需进行大量更改。还可以对原始算法进行一些修改,以减少乘法次数并提高整体性能:
static (int, int) Sqrt2(int n)
{
int m = 1, d = 2;
int dSquared;
while ((dSquared = d * d) <= n)
{
while ((n % dSquared) == 0)
{
n /= dSquared;
m *= d;
}
d++;
}
return (m, n);
}
static void Main(string[] args)
{
Console.WriteLine(Sqrt2(12)); // prints (2, 3)
Console.WriteLine(Sqrt2(16)); // prints (4, 1)
Console.WriteLine(Sqrt2(13)); // prints (1, 13)
}