#import @interface Algorithm : NSObject @property (atomic, strong) NSMutableArray *permutations; - (NSMutableArray *)findPermutations; - (void)shift:(long) number shifts: (char) shifts initialSubtraction: (long) initialSubtraction currentShiftIteration:(int)currentShiftIteration currentSubtractionIteration:(int)currentSubtractionIteration; - (void)subtract:(long)number subtractions:(char)subtractions initialSubtraction:(long)initialSubtraction currentShiftIteration:(int)currentShiftIteration currentSubtractionIteration:(int)currentSubtractionIteration; @end @implementation Algorithm @synthesize permutations; - (NSMutableArray *)findPermutations { permutations = [[NSMutableArray alloc] init]; [permutations addObject:[[NSNumber alloc] initWithChar:31]]; [self shift:(long)31 shifts:(char)4 initialSubtraction:(long)0 currentShiftIteration:0 currentSubtractionIteration:0]; return permutations; } - (void)shift:(long)number shifts:(char)shifts initialSubtraction:(long)initialSubtraction currentShiftIteration:(int)currentShiftIteration currentSubtractionIteration:(int)currentSubtractionIteration { if (currentShiftIteration >= 4) { return; } for(char b = 0; b < shifts; b++) { if (currentShiftIteration >= 4) { return; } number = (long)((long)number << 1); currentShiftIteration++; [permutations addObject:[[NSNumber alloc] initWithLong:number]]; initialSubtraction = (long)(((long)initialSubtraction << 1) + 1); [self subtract:number subtractions:shifts initialSubtraction:initialSubtraction currentShiftIteration:currentShiftIteration currentSubtractionIteration:currentSubtractionIteration]; } return; } - (void)subtract:(long)number subtractions:(char)subtractions initialSubtraction:(long)initialSubtraction currentShiftIteration:(int)currentShiftIteration currentSubtractionIteration:(int)currentSubtractionIteration { if (currentSubtractionIteration >= 4) { return; } long subtractionValue = initialSubtraction; for(char b = 0; b < subtractions; b++) { if (currentSubtractionIteration >= 4) { return; } number -= subtractionValue; currentSubtractionIteration++; subtractionValue = (long)((long)subtractionValue << 1); [permutations addObject:[[NSNumber alloc] initWithLong:number]]; [self shift:number shifts:(subtractions - 1) initialSubtraction:subtractionValue currentShiftIteration:currentShiftIteration currentSubtractionIteration:currentSubtractionIteration]; } } @end int main(int argc, char const *argv[]) { @autoreleasepool { Algorithm *myAlgorithm = [[Algorithm alloc] init]; NSMutableArray *permutations = [myAlgorithm findPermutations]; printf("[\n"); for (int i = 0; i < [permutations count]; ++i) { if (i == ([permutations count] - 1)) { printf("%4d", [[permutations objectAtIndex: i] intValue]); } else { printf("%4d, ", [[permutations objectAtIndex: i] intValue]); } } printf("\n]\n"); } return 0; }