0

そこで、biginteger プログラムを作成していますが、長さが異なる 2 つの配列を追加する際に問題が発生しています。私が抱えている問題は add メソッドにあります。配列を反復処理している場合、要素が範囲外かどうかをテストする方法はありますか。a の要素が nil に等しいかどうかをテストしようとしましたが、それでも例外が発生します。どんな助けでも大歓迎です。

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

これを更新しました

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

は次のようになりました。

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

私がする必要があると思うのは、配列aにありbにない、またはその逆のすべてのインデックスは、最初のゼロを追加することですが、その方法がわかりません。

各反復後に何をするかを出力したところ、次のようになりました。

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
4

1 に答える 1