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