保存欧几里德除法算法中的步骤

时间:2011-12-12 21:18:24

标签: objective-c nsmutablearray

我刚刚开始编程,对于我的第一个项目,我决定编写一个程序,用c中的欧几里德除法算法找到最大的公约数。

现在,我想扩展问题以保存间歇性商,余数,红利和除数,以便我可以使用它们。

我的想法是我可以在内部循环中添加一些东西,将四个变量中的每一个放入数组的一行,然后为循环的下一次迭代开始一个新行。

这是我到目前为止所拥有的。

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[])
{

    NSAutoreleasePool * pool =[[NSAutoreleasePool alloc]init];
    NSMutableArray * numberSaver=[[NSMutableArray alloc] init];
    NSNumber * q;
    NSNumber * end;
    NSNumber * or;
    NSNumber * rem;

    int a,b, divisor, dividend, quotient, remainder, temp, gcd, row;

    //get the two numbers
    NSLog(@"of which 2 numbers whould you like the GCD?");
    scanf("%u%u", &a,&b);

    //make the bigger number the dividend, smaller divisor

    if (a>b) {
        dividend=a;
        divisor=b;
    } else {
        dividend=b;
        divisor=a;
    }

    remainder=1;
    row=0;
    while (remainder !=0) {

        quotient=1;
        temp=divisor;

        while (temp<dividend) {
            temp+=divisor;
            ++quotient;
        }
        q=[NSNumber numberWithInt:quotient];
        end=[NSNumber numberWithInt: dividend];
        or=[NSNumber numberWithInt: divisor];
        //set NSNumber objects q, end, or to the integer values at quotient dividend and divisor

        gcd=divisor;
        //This is so that we can save divisor to be the GCD and not change it to 0 before it is printed
        remainder=quotient*divisor - dividend;
        rem=[NSNumber numberWithInt:remainder];
        //point to the remainder as an object

        dividend= divisor;
        divisor= remainder;
        //Get dividend and divisor ready for the next loop

        //I'd like to start adding the newly created NSNumbers to  numberSaver here
        [numberSaver addObject:quotient atIndex:row:0];
    }
    NSLog(@"gcd= %u",gcd);

    [pool drain] ;

    return 0;
}

1 个答案:

答案 0 :(得分:0)

我建议在循环的每次迭代中创建一个可变字典,并在将所有数字添加到该字典后,将其放入“master”数组中:

while (remainder !=0) {

    // Each time through the loop, a new dictionary is created and put
    // into iterationDict; you can then add objects to it.
    NSMutableDictionary * iterationDict = [NSMutableDictionary dictionary];

    // ...

    q=[NSNumber numberWithInt:quotient];
    end=[NSNumber numberWithInt: dividend];
    or=[NSNumber numberWithInt: divisor];

    [iterationDict setObject:q forKey:@"quotient"];
    [iterationDict setObject:end forKey:@"dividend"];
    [iterationDict setObject:or forKey:@"divisor"];

    // etc.
    [numberSaver addObject:iterationDict];
}

将这些内容存储在字典而不是数组中意味着您不必记住添加它们的订单divisor之前的dividend,e ..G)。相反,您可以通过密钥访问它们。稍后,您可以从数组中获取任何给定迭代的值:

NSUInteger iteration = 3;
NSNumber * quotient = [[numberSaver objectAtIndex:iteration] objectForKey:@"quotient"];

如果有任何需要解释,请发表评论。

相关问题