Я ищу библиотеку или существующий код для упрощения частей.
У кого-либо есть что-нибудь под рукой или какие-либо ссылки?
P.S. Я уже понимаю процесс, но действительно не хочу переписывать колесо
Хорошо я проверил дробную библиотеку по CodeProject, НО проблемой, которую я имею, является немного tricker, чем упрощение части.
Я должен уменьшить разделение процента, которое могло составить 20% / 50% / 30% (всегда равный 100%)
Я думаю, вам просто нужно разделить на НОД все числа.
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));
}
Я не пробовал код, но он кажется достаточно простым, чтобы быть правым (при условии, что все ваши числа являются положительными целыми числами и вы не передаете пустой массив).
Вы можете использовать Microsoft.FSharp.Math.BigRational, который находится в бесплатной библиотеке F # Power Pack . Хотя это зависит от F # (который предоставляется бесплатно и включен в VS2010), его можно использовать из C #.
BigRational reduced = BigRational.FromInt(4)/BigRational.FromInt(6);
Console.WriteLine(reduced);
2/3
Console.WriteLine(reduced.Numerator);
2
Console.WriteLine(reduced.Denominator);
3
Индивидуальное решение:
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;
}
}
}
}
Пример использования:
int [] percentages = {20,30,50};
simplify(percentages);
foreach (int p in percentages)
{
Console.WriteLine(p);
}
Выходы:
2
3
5
Кстати, это моя первая программа на C #. Подумал, что было бы просто весело попробовать новый язык, и теперь я влюблен! Это похоже на Java, но все, что я хотел, было немного другим, это именно то, что я хотел
<3 c #
Edit: Кстати, не забудьте сделать его static void, если это для вашего класса Main.
Эта библиотека выглядит так, как будто это то, что вам нужно:
var f = new Fraction(numerator, denominator);
numerator = f.Numerator;
denominator = f.Denominator;
Хотя я не тестировал ее, поэтому похоже, что вам, возможно, придется поэкспериментировать с ней, чтобы заставить ее работать.
Лучший пример Fraction (он же Rational), который я видел, можно найти в Тимоти Бадда «Классические структуры данных в C ++» . Его реализация очень хороша. Он включает простую реализацию алгоритма GCD.
Адаптироваться к C # не составит труда.