courtney
courtney

Reputation: 91

array index out of bounds problems

So I'm making a biginteger program, and I'm having a problem with adding two arrays that aren't the same length. The problem I'm having is with the add method. If I'm iterating through an array is there any way to test if element is out of bounds. I've tried testing if the element in a is equal to nil, but I still get the exception. Any help would be great thanks.

 #import <Foundation/Foundation.h>
    #import "MPInteger.h"

    @implementation MPInteger

    {
    }

    -(id) initWithString: (NSString *) x
    {
        self = [super init];
        if (self) {
            intString = [NSMutableArray array];
            for (int i = 0; i < [x length]; i++) {
                NSString *ch = [x substringWithRange:NSMakeRange(i, 1)];
                [intString addObject:ch];

            }

        }

        return self;
    }

    -(NSString *) description
    {
        return self.description;
    }


    - (MPInteger *) add: (MPInteger *) x {
        NSMutableArray *a = self->intString;
        NSMutableArray *b = x->intString;
        NSMutableArray *c = [NSMutableArray array];
        NSInteger arrayCount;
        if (a < b) {
            arrayCount = [b count];
        } else {
            arrayCount = [a count];
        }
        int num = 10;
        int carry = 1;
        NSNumber *total;
        NSNumber *carrySum;
        for (int i = 0; i < arrayCount; i++) {
            if (a[i] == nil) {

                total = @([b[i] intValue]);
                [c addObject:total];
            } else if (b[i] == nil) {
                total = @([a[i] intValue]);
                [c addObject:total];
            } else {
            total = @([a[i] intValue] + [b[i] intValue]);
            [c addObject:total];
            }
        }
        for (NSInteger j = [c count]-1; j >=0; j--) {
            if ([c[j] intValue] >= num) {
                total = @([c[j] intValue] - num);
                carrySum = @([c[j-1] intValue] + carry);
                [c replaceObjectAtIndex:j withObject:total];
                [c replaceObjectAtIndex:j-1 withObject: carrySum];
            }

        }
        NSString *str = [c componentsJoinedByString:@""];
        NSLog(@"%@", str);

        return x;
    }

    -(MPInteger *) multiply: (MPInteger *) x
    {

        NSMutableArray *a = self->intString;
        NSMutableArray *b = x->intString;
        NSMutableArray *c = [NSMutableArray array];
        NSMutableArray *sum = [NSMutableArray array];
        NSNumber *total;
        NSNumber *carrySum;
        int num = 10;
        NSNumber *endZero = 0;
        NSInteger bottomCount = [b count]-1;
        while (bottomCount != -1) {

            for (int i = 0; i < [a count]; i++) {
                total = @([a[i] intValue] * [[b objectAtIndex:bottomCount] intValue]);
                if (bottomCount == [b count] -1) {
                    [c addObject:total];
                } else {
                    [c replaceObjectAtIndex:i withObject:total];
                }
            }


            for (NSInteger j = [c count]-1; j>=0; j--) {
                NSString *carry = [NSString stringWithFormat:@"%d", [c[j] intValue]];
                NSString *carry2 = [carry substringToIndex:1];
                int carryFinal = [carry2 intValue];
                NSString *carry3 = [carry2 stringByAppendingString:@"0"];
                int carry4 = [carry3 intValue];

                if ([c[j] intValue] >= num) {
                    total = @([c[j] intValue] - carry4);
                    carrySum = @([c[j-1] intValue] + carryFinal);
                    [c replaceObjectAtIndex:j withObject:total];
                    [c replaceObjectAtIndex:j-1 withObject: carrySum];
                } else {
                    if(j == 0) {
                        if (bottomCount == [b count] -1) {
                            bottomCount = bottomCount - 1;
                            NSString *str = [c componentsJoinedByString:@""];
                            [sum addObject: str];
                        } else {
                            [c addObject:@([endZero intValue])];
                            bottomCount = bottomCount - 1;
                            NSString *str = [c componentsJoinedByString:@""];
                            [sum addObject: str];
                        }
                    }
                }
            }
        }

        NSMutableArray *finalSum = [NSMutableArray array];
        MPInteger *ele1;
        MPInteger *ele2;
        MPInteger *eleSum;

        NSNumber *endZ= @(0);
        [finalSum insertObject:endZ atIndex:0];
        for (int k = 0; k < [sum count]; k++) {
            NSString *str= [NSString stringWithFormat:@"%d", [sum[k] intValue]];
            NSString *str2 = [NSString stringWithFormat:@"%d", [sum[k+1] intValue]];
            ele1 = [[MPInteger alloc] initWithString:str];
            ele2 = [[MPInteger alloc] initWithString:str2];
            eleSum = [ele1 add: ele2];
            NSLog(@"%@", eleSum);
        }

        NSLog(@"%@", sum);



            return self;
        }

Updated this

  for (int i = 0; i < arrayCount; i++) {
            if (a[i] == nil) {

                total = @([b[i] intValue]);
                [c addObject:total];
            } else if (b[i] == nil) {
                total = @([a[i] intValue]);
                [c addObject:total];
            } else {
            total = @([a[i] intValue] + [b[i] intValue]);
            [c addObject:total];
            }
        }

has now become:

NSMutableArray *c = a.count > b.count ? [a mutableCopy] : [b mutableCopy];
NSArray *shortestArray = a.count > b.count ? b : a;

[shortestArray enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(NSNumber *currentNumber, NSUInteger idx, BOOL *stop) {
        c[idx] = @(currentNumber.integerValue + [c[idx] integerValue]);
        NSLog(@"%@", c[idx]);
}];

What I think I need to do is every index that is in array a and not b or vise versa, is add beginning zeros, but I don't know how to do that.

I printed out what it does after each iteration and it gives:

2013-09-02 12:31:42.630 Asgn1[42471:303] 5
2013-09-02 12:31:42.632 Asgn1[42471:303] 3
2013-09-02 12:31:42.632 Asgn1[42471:303] 1
And a final answer of:
2013-09-02 12:31:42.633 Asgn1[42471:303] 353

Upvotes: 0

Views: 561

Answers (1)

Paul.s
Paul.s

Reputation: 38728

For the code that is failing would it not be simpler to take a mutableCopy of the large array and then loop over the smaller array for the calculations?

Perhaps something like this:

NSMutableArray *c             = a.count > b.count ? [a mutableCopy] : [b mutableCopy];
NSArray        *shortestArray = a.count > b.count ? b : a;

[shortestArray enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(NSNumber *currentNumber, NSUInteger idx, BOOL *stop) {
  c[idx] = @(currentNumber.integerValue + [c[idx] integerValue]);
}];

Upvotes: 1

Related Questions