Сохранение шагов в алгоритме евклидова деления - PullRequest
0 голосов
/ 13 декабря 2011

Я только начинаю программировать, и для своего первого проекта я решил написать программу для нахождения наибольшего общего делителя с использованием алгоритма евклидова деления в 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 голосов
/ 13 декабря 2011

Я бы предложил создать изменяемый словарь с каждой итерацией цикла и, после добавления всех чисел к нему, поместить его в массив «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"];

Пожалуйста, прокомментируйте, если что-либо из этого требует объяснения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...