Iphone 将选择器上的分数格式化为最低公分母?

Iphone 将选择器上的分数格式化为最低公分母?,iphone,ios,arrays,format,picker,Iphone,Ios,Arrays,Format,Picker,下面是我当前格式化选择器的方式。我真的希望它显示1/8而不是2/16或1/2而不是8/16。我如何调整它以显示我想要的输出?谢谢大家! fractionArray = [[NSMutableArray alloc] init]; for(int frac = 0; frac <= 15; frac ++){ NSString *fracString = [NSString stringWithFormat:@"%d/16", frac]; [fractionArray a

下面是我当前格式化选择器的方式。我真的希望它显示1/8而不是2/16或1/2而不是8/16。我如何调整它以显示我想要的输出?谢谢大家!

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

对于(int-frac=0;frac这应适用于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.
}
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];
}
//避开这种特殊情况:
[分馏阵列添加对象:@“0”];

对于(int分子=1;分子这应该适用于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.
}
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];
}
//避开这种特殊情况:
[分馏阵列添加对象:@“0”];
对于(int-numerator=1;numerator这些天的孩子们……他们在学校里教什么……咕哝咕哝

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];
}
现在的孩子们…他们在学校教什么…抱怨

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];
}


可能的重复项。请参阅第二个答案。这是转换小数,而不是分数…?您可以通过使用
-componentsSeparatedByString:
获取两个必要的参数来轻松解决问题。不要轻易低估第二个答案的值。如果您能够在该页上提供一个示例,我将很高兴地结束这篇文章。我显然没有你那么先进。我通过看代码来学习,然后理解它是如何工作的。可能的重复。请看第二个答案。那就是转换小数,而不是小数…?通过使用
-componentsSeparatedByString:
,获得两个必要的参数,你可以很容易地进入解决方案。不要忽视这个问题第二个答案的价值如此简单。如果你能在那页上提供一个例子,我将很高兴地结束这篇文章。我显然没有你那么先进。我通过看代码来学习,然后理解它是如何工作的。NSString*fracString=[NSString stringWithFormat:@“%d/%d”,分子,分母];是的,愚蠢的好吧:如果我们把分子除以2,它会搞糟循环。我会编辑答案。:@davehayden最上面的代码有效,但它显示为“0,1/16,1/8,3/16,1/4,5/16,3/8,7/16,1/2,9/16,5/8,11/16,3/4,13/16,7/8,15/16,1/16,0等等,然后在15/16之后显示2/16。所以在每一英寸之后,在15/16之后它继续运行3/16,4/16等等。所以我想我不想要一个循环,因为它只需要运行一次…?不,罗布·马约夫得到了正确的答案:只要找到GCD(分子和分母的最大公约数),然后将它们都除以该数字。更快、更干净、更全面!在NSString*fracString=[NSString stringWithFormat:@“%d/%d”,分子、分母]上崩溃;是的,boneheaded好吧:如果我们将分子除以2,就会搞糟循环。我将编辑答案。:)@davehayden顶层代码可以工作,但它显示为“0,1/16,1/8,3/16,1/4,5/16,3/8,7/16,1/2,9/16,5/8,11/16,3/4,13/16,7/8,15/16,1/16,0等等,然后在15/16之后显示2/16。所以在每一英寸之后,在15/16之后它继续运行3/16,4/16等等。所以我想我不想要一个循环,因为它只需要运行一次…?不,罗布·马约夫得到了正确的答案:只要找到GCD(分子和分母的最大公约数),然后将它们都除以该数字。更快、更干净、更全面!哈!当然!我不记得这一点的借口是我从来没有在任何事情上使用gcd()。另一方面,gcd非常有用。:)这段代码到处都是错误,我不知道从哪里开始修复它。我发布的代码中没有错误。我已经在上放了一个完整的工作示例及其输出。好的,那么我该如何将其应用到我上面的代码中呢?因为在你的代码中,我收到了7个警告和7个错误。我甚至不知道从哪里开始修复它们。我正在将我上面的代码放入viewDidLoad,这是我的问题吗?哈!当然!我不记得这一点的借口是我从来没有在任何事情上使用gcd()。另一方面,gcd非常有用。:)这段代码到处都是错误,我不知道从哪里开始修复它。我发布的代码中没有错误。我已经在上放了一个完整的工作示例及其输出。好的,那么我该如何将其应用到我上面的代码中呢?因为在你的代码中,我收到了7个警告和7个错误。我甚至不知道从哪里开始修复它们。我正在将我上面的代码放入viewDidLoad,这是我的问题吗?