これは簡単だと思いましたが、Googleを検索しても役に立たなかったようです。
私は基本的に、2つの整数(たとえば800と600)を提供するときに、比率を文字列(たとえば、4:3)として返す関数を作成しようとしています。
string GetRatio(Int A, Int B) {
// Code I'm looking for
return Ratio;
}
これは簡単だと思いましたが、Googleを検索しても役に立たなかったようです。
私は基本的に、2つの整数(たとえば800と600)を提供するときに、比率を文字列(たとえば、4:3)として返す関数を作成しようとしています。
string GetRatio(Int A, Int B) {
// Code I'm looking for
return Ratio;
}
分子と分母をGCDで割ることにより、分数を簡略化できます。
var gcd = GCD(A, B);
return string.Format("{0}:{1}", A / gcd, B / gcd)
そして、ユークリッドアルゴリズムを使用してGCDを計算するための非常に基本的な関数:
static int GCD(int a, int b) {
return b == 0 ? Math.Abs(a) : GCD(b, a % b);
}
基本的に、最大公約数(2つの数値のGCD)を取得し、それで除算して文字列を取得しようとしていますか?
すなわち:800:600; 最大公約数=200、したがって4:3。
これにより、すべての整数を処理できるようになります。コードを送信しなかったことをお詫びしますが、これからは十分に単純なはずだと思います。
public int GCD(int a, int b)
{
while (a != 0 && b != 0)
{
if (a > b)
a %= b;
else
b %= a;
}
if (a == 0)
return b;
else
return a;
}
// Using Konrad's code:
var gcd = GCD(A, B);
return string.Format("{0}:{1}", A / gcd, B / gcd)
過去にそのようなもので遊んだことがありますが、符号付きの値を扱うのは見苦しくなる可能性があることを付け加えておきます。符号付きの値を処理する最も簡単な方法は、元の数値の絶対値に Konrad のアプローチを適用し、元の値の符号が異なる場合は、結果の文字列に「-」を追加することです。
このアプローチを使用すると、-100 と -35 の最大公約数は 5 で、比率は 20:7 になります。元の入力がペア (-100 と 35) または (100 と -35) のいずれかだった場合でも、GCD は 5 で、最初の結果は 20:7 ですが、最終的な答えは - 20:7 (つまり、-6/2 と 6/-2 = -3 の両方のように、どちらの入力が負であったかに関係なく、標準化された形式)。
他のコメンテーターは、整数に対して適切な解決策を提供しています。ただし、実際に浮動小数点値を処理する必要がある場合は、別のものが必要になります。一般に、2 つの実数には、きれいに印刷できるようなきれいな比率はありません。あなたが望むのは、最も近い合理的な近似です。おそらく、それを見つける最良の方法は、商の連分数展開を計算することです。Mark Dominus は、彼のブログでそれらについて適切な紹介をしています。
次の 2 つの関数を使用すると、除算を使用せずに 2 つの数値の比率を取得できます。
static int GCD(int p, int q)//find greatest common divisor
{
if (q == 0)
{
return p;
}
int r = p % q;
return GCD(q, r);
}
static string FindRatio(int num1, int num2)
{
string oran = "";
int gcd;
int quotient = 0;
while (num1 >= num2)
{
num1 = num1 - num2;
quotient++;
}
gcd = GCD(num1, num2);
//without using division finding ration of num1 i1
int i1 = 1;
while (gcd*i1 != num1)
{
i1++;
}
//without using division finding ration of num1 i2
int i2 = 1;
while (gcd * i2 != num2)
{
i2++;
}
oran = string.Concat(quotient, " ", i1,"/",i2);
return oran;
}
出力は次のようになります:
coff num1 / num2