Итак, я делаю программу biginteger, и у меня возникла проблема с добавлением двух массивов, которые не имеют одинаковой длины. Проблема, с которой я столкнулась, связана с методом добавления. Если я выполняю итерацию через массив, есть ли способ проверить, находится ли элемент вне пределов. Я пробовал тестировать, если элемент в a равен нулю, но я все еще получаю исключение. Любая помощь будет большой благодарностью.Проблема с индексом массива вне границ
#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]);
}];
То, что я думаю, что нужно сделать, это каждый индекс, который находится в массиве а и не б или наоборот, является добавьте начальные нули, но я не знаю, как это сделать.
я напечатал, что он делает после каждой итерации, и это дает:
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
Сократите код неисправной части, где сливаются массивы. –
вам нужно проверить, меньше ли значение 'i' меньше [array count] для рассматриваемого массива. Вы также можете заполнить разницу нулями, но не уверены, что это будет эффективно для вас. –
Я думал о том, чтобы делать ноль, но я не знал, как это сделать. Но я попробую проверка i на счет массива. – courtney