そこで、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