如何简化C#中的分数?

如何简化C#中的分数?,c#,math,fractions,C#,Math,Fractions,我正在寻找一个库或现有的代码来简化分数 有人手头有什么东西或任何链接吗 顺便说一句,我已经说过了,但我真的不想重写轮子 更新 好的,我已经查过了 但我遇到的问题比简化一个分数要棘手得多 我必须减少20%/50%/30%(始终等于100%)的百分比分割看起来这可能是您需要的: var f = new Fraction(numerator, denominator); numerator = f.Numerator; denominator = f.Denominator; 虽然,我还没有测试过它

我正在寻找一个库或现有的代码来简化分数

有人手头有什么东西或任何链接吗

顺便说一句,我已经说过了,但我真的不想重写轮子

更新 好的,我已经查过了 但我遇到的问题比简化一个分数要棘手得多

我必须减少20%/50%/30%(始终等于100%)的百分比分割

看起来这可能是您需要的:

var f = new Fraction(numerator, denominator);
numerator = f.Numerator;
denominator = f.Denominator;

虽然,我还没有测试过它,所以看起来你可能需要使用它来让它工作。

我见过的分数(也称为有理数)的最好例子是。他的执行非常好。它包括GCD算法的一个简单实现


适应C#应该不难。

您可以使用免费库中的Microsoft.FSharp.Math.BigRational。尽管它取决于F#(这是免费的,包含在VS2010中),但它可以从C#开始使用

自定义解决方案:

void simplify(int[] numbers)
{
    for (int divideBy = 50; divideBy > 0; divideBy--)
    {
        bool divisible = true;
        foreach (int cur in numbers)
        {   

            //check for divisibility
            if ((int)(cur/divideBy)*divideBy!=cur){
                divisible = false;
                break;
            }

        }
        if (divisible)
        {
            for (int i = 0; i < numbers.GetLength(0);i++ )
            {
                numbers[i] /= divideBy;
            }
        }
    }
}
结果:

2
3
5

顺便说一下,这是我的第一个c#程序。我以为尝试一门新语言会是一个有趣的问题,现在我爱上了它!它就像Java,但我希望的一切都有点不同,这正是我想要的


我想你只需要除以所有数字的GCD

void Simplify(int[] numbers)
{
    int gcd = GCD(numbers);
    for (int i = 0; i < numbers.Length; i++)
        numbers[i] /= gcd;
}
int GCD(int a, int b)
{
    while (b > 0)
    {
        int rem = a % b;
        a = b;
        b = rem;
    }
    return a;
}
int GCD(int[] args)
{
    // using LINQ:
    return args.Aggregate((gcd, arg) => GCD(gcd, arg));
}
void简化(int[]数字)
{
int gcd=gcd(数字);
for(int i=0;i0)
{
int rem=a%b;
a=b;
b=雷姆;
}
返回a;
}
int GCD(int[]args)
{
//使用LINQ:
返回参数聚合((gcd,参数)=>gcd(gcd,参数));
}

我没有尝试过这段代码,但它似乎足够简单,是正确的(假设您的数字都是正整数,并且不传递空数组)。

因此百分比拆分可以是2路、3路或更大拆分中的每个百分比始终是0-100之间的整数吗?如果是这样的话,我有一个答案给你。是的,它们将是整数0-100是的,几乎完成了,等等,大约5-6分钟;)是的,这绝对是一种合法的编码方式:我会选择这个解决方案,因为它不需要为您的号码(即[01100])设置一个小的固定域。简化的方法也很容易理解+1是的,花了一段时间才回到这个问题上来。但这绝对是有效的答案!谢谢,添加素性检查是错误的。想象一下当您的数据是
{298}
时会发生什么。此外,由于这是您的第一个C#程序,您可能没有意识到您可以使用
cur%divideBy!=0
来检查不可分割性,并且由于数组只有一个维度,因此可以使用
numbers.Length
来获取元素的数量。对于{3,3,3}这样的情况不起作用,它应该减少到{1,1,1}
2
3
5
void Simplify(int[] numbers)
{
    int gcd = GCD(numbers);
    for (int i = 0; i < numbers.Length; i++)
        numbers[i] /= gcd;
}
int GCD(int a, int b)
{
    while (b > 0)
    {
        int rem = a % b;
        a = b;
        b = rem;
    }
    return a;
}
int GCD(int[] args)
{
    // using LINQ:
    return args.Aggregate((gcd, arg) => GCD(gcd, arg));
}