2013-09-01 3 views
0

Итак, я делаю программу 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 
+0

Сократите код неисправной части, где сливаются массивы. –

+0

вам нужно проверить, меньше ли значение 'i' меньше [array count] для рассматриваемого массива. Вы также можете заполнить разницу нулями, но не уверены, что это будет эффективно для вас. –

+0

Я думал о том, чтобы делать ноль, но я не знал, как это сделать. Но я попробую проверка i на счет массива. – courtney

ответ

1

Для кода, который неисправный не было бы проще взять mutableCopy из большого массива, а затем цикла по меньшей массива для расчетов?

Возможно, что-то вроде этого:

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

@courtney вы вообще посмотрели на это решение? –

+0

Да, я просмотрел этот код. Я совершенно новичок в объективе c, и я стараюсь держать его как можно проще. Но я попробую этот код и посмотрю, поможет ли он. – courtney

+0

Хорошо, я пробовал свой код на 123 + 23, и он просматривает весь блок, но он дает мне 353, так или иначе, чтобы перечислить назад по массиву? – courtney

Смежные вопросы