C# 普通分数的加减
我试图把两个粗俗的分数相加,找到最小的公分母,然后相加。然而,我的代码并不像预期的那样运行,并且输出了两个非常高的负数。当我将第二个分数更改为3/15时,它输出0/0 以下是我的主要程序代码:C# 普通分数的加减,c#,fractions,C#,Fractions,我试图把两个粗俗的分数相加,找到最小的公分母,然后相加。然而,我的代码并不像预期的那样运行,并且输出了两个非常高的负数。当我将第二个分数更改为3/15时,它输出0/0 以下是我的主要程序代码: class Program { static void Main(string[] args) { Fraction n = new Fraction(2, 4); Fraction z = new Fraction(3, 12); Fra
class Program
{
static void Main(string[] args)
{
Fraction n = new Fraction(2, 4);
Fraction z = new Fraction(3, 12);
Fraction sum = n.Add(z, n);
int num = sum.Numerator;
int den = sum.Denominator;
Console.WriteLine("{0}/{1}", num, den);
Console.ReadKey(true);
}
}
这是我的分数
课程代码:
internal class Fraction
{
public Fraction(int numerator, int denominator)
{
Numerator = numerator;
Denominator = denominator;
}
public int Numerator { get; private set; }
public int Denominator { get; private set; }
public Fraction Add(Fraction fraction2, Fraction fraction8)
{
int lcd = GetLCD(fraction8, fraction2);
int x = lcd/fraction8.Denominator;
int n = lcd/fraction2.Denominator;
int f2num = fraction2.Numerator*n;
int f8num = fraction8.Numerator*x;
int t = fraction2.Numerator;
Fraction Fraction3 = new Fraction(f2num+f8num,lcd);
return Fraction3;
}
public int GetLCD(Fraction b, Fraction c)
{
int i = b.Denominator;
int j = c.Denominator;
while (true)
{
if (i == j)
{
return i;
}
j = j + j;
i = i + i;
}
}
}
在类中使用
GetLCD,Add&Subtract方法是没有意义的。所以,我把它移出了类,让它们成为静态方法
您的GetLCD
函数无法正确获取LCD。这将为您提供所需的结果。(我没有费心让减法工作,您可以按照下面的代码&让它自己工作)
PS:我没有更改所有变量名&我建议您尽可能使它们有意义。n、 z、x、y、b、c不是好的变量名
static void Main(string[] args)
{
Fraction n = new Fraction(2, 4);
Fraction z = new Fraction(3, 12);
Fraction sum = Add(z, n);
int x = sum.Numerator;
int y = sum.Denominator;
Console.WriteLine("{0}/{1}", x, y);
Console.ReadKey(true);
}
public static Fraction Add(Fraction fraction2, Fraction fraction8)
{
int lcd = GetLCD(fraction8, fraction2);
int multiplier = 0;
if (fraction2.Denominator < lcd)
{
multiplier = lcd / fraction2.Denominator;
fraction2.Numerator = multiplier * (fraction2.Numerator);
fraction2.Denominator = multiplier * (fraction2.Denominator);
}
else
{
multiplier = lcd / fraction8.Denominator;
fraction8.Numerator = multiplier * (fraction8.Numerator);
fraction8.Denominator = multiplier * (fraction8.Denominator);
}
Fraction Fraction3 = new Fraction(fraction2.Numerator + fraction8.Numerator, lcd);
return Fraction3;
}
public static int GetLCD(Fraction b, Fraction c)
{
int i = b.Denominator;
int j = c.Denominator;
int greater = 0;
int lesser = 0;
if (i > j)
{
greater = i; lesser = j;
}
else if (i < j)
{
greater = j; lesser = i;
}
else
{
return i;
}
for (int iterator = 1; iterator <= lesser; iterator++)
{
if ((greater * iterator) % lesser == 0)
{
return iterator * greater;
}
}
return 0;
}
internal class Fraction
{
public Fraction(int numerator, int denominator)
{
Numerator = numerator;
Denominator = denominator;
}
public int Numerator { get; set; }
public int Denominator { get; set; }
}
static void Main(字符串[]args)
{
分数n=新分数(2,4);
分数z=新分数(3,12);
分数和=加(z,n);
int x=分子总和;
int y=和分母;
Console.WriteLine(“{0}/{1}”,x,y);
Console.ReadKey(true);
}
公共静态分数添加(分数分数2、分数8)
{
int-lcd=GetLCD(分数8,分数2);
整数乘数=0;
if(分数2.分母j)
{
较大=i;较小=j;
}
else if(i 对于(int iterator=1;iterator来说,在类中使用GetLCD,Add&Subtract
方法是没有意义的。因此,我将其从类中移出,使其成为静态方法
您的GetLCD
函数无法正确获取LCD。这将为您提供所需的结果。(我没有费心让减法工作,您可以按照下面的代码操作,让它自己工作)
PS:我没有更改所有变量名&我建议您尽可能使它们有意义。n、z、x、y、b、c不是好的变量名
static void Main(string[] args)
{
Fraction n = new Fraction(2, 4);
Fraction z = new Fraction(3, 12);
Fraction sum = Add(z, n);
int x = sum.Numerator;
int y = sum.Denominator;
Console.WriteLine("{0}/{1}", x, y);
Console.ReadKey(true);
}
public static Fraction Add(Fraction fraction2, Fraction fraction8)
{
int lcd = GetLCD(fraction8, fraction2);
int multiplier = 0;
if (fraction2.Denominator < lcd)
{
multiplier = lcd / fraction2.Denominator;
fraction2.Numerator = multiplier * (fraction2.Numerator);
fraction2.Denominator = multiplier * (fraction2.Denominator);
}
else
{
multiplier = lcd / fraction8.Denominator;
fraction8.Numerator = multiplier * (fraction8.Numerator);
fraction8.Denominator = multiplier * (fraction8.Denominator);
}
Fraction Fraction3 = new Fraction(fraction2.Numerator + fraction8.Numerator, lcd);
return Fraction3;
}
public static int GetLCD(Fraction b, Fraction c)
{
int i = b.Denominator;
int j = c.Denominator;
int greater = 0;
int lesser = 0;
if (i > j)
{
greater = i; lesser = j;
}
else if (i < j)
{
greater = j; lesser = i;
}
else
{
return i;
}
for (int iterator = 1; iterator <= lesser; iterator++)
{
if ((greater * iterator) % lesser == 0)
{
return iterator * greater;
}
}
return 0;
}
internal class Fraction
{
public Fraction(int numerator, int denominator)
{
Numerator = numerator;
Denominator = denominator;
}
public int Numerator { get; set; }
public int Denominator { get; set; }
}
static void Main(字符串[]args)
{
分数n=新分数(2,4);
分数z=新分数(3,12);
分数和=加(z,n);
int x=分子总和;
int y=和分母;
Console.WriteLine(“{0}/{1}”,x,y);
Console.ReadKey(true);
}
公共静态分数添加(分数分数2、分数8)
{
int-lcd=GetLCD(分数8,分数2);
整数乘数=0;
if(分数2.分母j)
{
较大=i;较小=j;
}
else if(i 对于(int iterator=1;iterator就个人而言,我认为你的第一个错误是试图计算最小的公分母,而不是仅仅找到最简单的公分母。由于模式识别,找到LCD是人类在纸上解决这一问题的一个伟大策略:我们可以快速识别LCD;但是计算LCD,然后当将分数转换为它时,对于一台每次都必须执行每一步(并且不能识别模式)的计算机来说,显然需要更多的步骤。另外,在将两个分数转换到其LCD后,添加这两个分数后,它甚至不能保证是一个简化的结果。我假设简化的结果是必需的,这通常是分数算术所期望的。由于它似乎很有用,我将简化直接放入构造函数代码中:
internal class Fraction
{
public Fraction(int numerator, int denominator, bool reduce = false)
{
if (!reduce)
{
Numerator = numerator;
Denominator = denominator;
}
else
{
var GCD = GreatestCommonDivisor(numerator, denominator);
Numerator = numerator / GCD;
Denominator = denominator / GCD;
}
}
public int Numerator { get; private set; }
public int Denominator { get; private set; }
public static Fraction Add(Fraction first, Fraction second)
{
return Combine(first, second, false);
}
public static Fraction Subtract(Fraction first, Fraction second)
{
return Combine(first, second, true);
}
private static Fraction Combine(Fraction first, Fraction second, bool isSubtract)
{
var newDenominator = first.Denominator * second.Denominator;
var newFirst = first.Numerator * second.Denominator;
var newSecond = first.Denominator * second.Denominator;
if (isSubtract)
{
newSecond = newSecond * -1;
}
return new Fraction(newFirst + newSecond, newDenominator, true);
}
private static int GreatestCommonDivisor(int a, int b)
{
return b == 0 ? a : GreatestCommonDivisor(b, a % b);
}
}
编辑:从中盗取了最大公约数代码就个人而言,我认为你的第一个错误是试图计算最小的公约数,而不是仅仅找到最简单的公约数。找到LCD是人类在纸上解决这个问题的一个伟大策略,因为模式识别:我们可以快速识别LCD;但是c计算LCD,然后将分数转换成LCD,对于一台每次都必须执行每一步(并且不能识别模式)的计算机来说,这显然是更多的步骤。另外,在将两个分数转换到LCD后,添加两个分数后,甚至不能保证得到简化的结果。我假设需要简化的结果,就像分数算术通常所期望的那样