0

以下は、現在ピッカーをフォーマットしている方法です。2/16ではなく1/8、8/16ではなく1/2を表示したいのですが。これを調整して、目的の出力を表示するにはどうすればよいですか?ありがとうございました!

fractionArray = [[NSMutableArray alloc] init];
for(int frac = 0; frac <= 15; frac ++){ 
    NSString *fracString = [NSString stringWithFormat:@"%d/16", frac];
    [fractionArray addObject:fracString]; // Add the string.
4

2 に答える 2

2

これは、2の分母の累乗で機能するはずです。

// dodge this special case:
[fractionArray addObject:@"0"];

for ( int numerator = 1; numerator <= 15; numerator++ )
{
    int denominator = 16;
    int num = numerator;

    while ( num % 2 == 0 )
    {
        num /= 2;
        denominator /= 2;
    }

    NSString *fracString = [NSString stringWithFormat:@"%d/%d", num, denominator];
    [fractionArray addObject:fracString]; // Add the string.
}

そして、これを任意の分母に拡張するのは簡単です。(ヒント:2をnに置き換え、nを2からsqrt(分母)まで繰り返します。)

編集:実際に今動作します!


私が先に進んでそれをコーディングしたので、これが分母を因数分解するバージョンです:

int denominator = 240;

for ( int numerator = 1; numerator < denominator; numerator++ )
{
    int denom = denominator;
    int num = numerator;
    int factor = 2;

    while ( factor * factor < denom )
    {
        while ( (num % factor) == 0 && (denom % factor) == 0 )
        {
            num /= factor;
            denom /= factor;
        }

        // don't worry about finding the next prime,
        // the loop above will skip composites
        ++factor; 
    }

    NSString *fracString = [NSString stringWithFormat:@"%d/%d", num, denom];
    [fractionArray addObject:fracString];
}
于 2012-04-24T03:41:59.760 に答える
2

最近の子供たち...ユークリッドのアルゴリズム...彼らは学校で何を教えています...不平不平...

int gcd(int a, int b) {
    // assumes a >= 0 && b > 0
    while (b != 0) {
        int t = a % b;
        a = b;
        b = t;
    }
    return a;
}

NSString *stringByReducingFraction(int a, int b) {
    if (a == 0) return @"0";
    if (a == b) return @"1";

    int g = gcd(a, b);
    return [NSString stringWithFormat:@"%d/%d", a / g, b / g];
}
于 2012-04-24T17:17:34.437 に答える