簡體   English   中英

值超出目標c的算術運算

[英]Arithmetic operation of value that exceeds limit in objective c

我一直在嘗試關於黑客排名的問題,其中考慮了字符串的所有子字符串的加法。 這樣做,我們的答案超出了NSInteger,NSUInteger,長,非常長,兩倍的限制。

所以在這種情況下,我嘗試了

- (NSDecimalNumber *) substrings:(NSString *)n {

    NSCharacterSet* notDigits = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
    if ([n rangeOfCharacterFromSet:notDigits].location == NSNotFound) {

        NSNumberFormatter *f = [[NSNumberFormatter alloc] init];
        f.numberStyle = NSNumberFormatterNoStyle;
        NSDecimalNumber *sum = [NSDecimalNumber decimalNumberWithString:@"0"];
        NSMutableArray *arr = [[NSMutableArray alloc] init];
        for (NSInteger i = 0; i<n.length; i++) {

            for (NSInteger j = 1; j<=n.length-i; j++) {

                NSString *stringInRange = [n substringWithRange:NSMakeRange(i, j)];
                [arr addObject:stringInRange];
                NSDecimalNumber *myNumber1 = [NSDecimalNumber decimalNumberWithString:stringInRange];
                sum = [sum decimalNumberByAdding:myNumber1];
            }
        }
        return sum;
    } else {

        return nil;
    }
}

但仍然,我得到加法的錯誤答案。 我想知道在這種情況下,測試用例包含的值比限制值大得多,我們應該使用哪種API來執行算術運算?

我嘗試過的方法是否正確?

如果需要在Objective-C中使用大整數值進行操作,則可以使用JKBigInteger 例如,您可以將2個大整數相乘,然后使用JKBigInteger將結果轉換為NSString 在這里,您可以看到如何使用此庫:

JKBigInteger *bigInteger1 = [[JKBigInteger alloc] initWithString:@"2"];
JKBigInteger *bigInteger2 = [[JKBigInteger alloc] initWithString:@"3"];
JKBigInteger* bigInteger3 = [bigInteger1 add:bigInteger2];
NSLog(@"%@", [bigInteger3 stringValue]); // output is 5

而且我想您可以使用此功能獲得所需的值:

-(JKBigInteger*)sumOfSubValues:(JKBigInteger*)value {
    JKBigInteger* currentValue = [[JKBigInteger alloc] initWithString:value.stringValue];
    JKBigInteger* result = [[JKBigInteger alloc] initWithString:currentValue.stringValue];
    NSUInteger digitsCount = currentValue.stringValue.length - 1;
    JKBigInteger* const tenValue = [[JKBigInteger alloc] initWithString:@"10"];
    while (digitsCount != 0) {
        JKBigInteger* const firstDigit = [[JKBigInteger alloc] initWithString:[currentValue.stringValue substringToIndex:1]];
        JKBigInteger* const firstDigitPowerBase = [tenValue pow:(unsigned int)digitsCount];
        JKBigInteger* const firstDigitPower = [firstDigit multiply:firstDigitPowerBase];
        JKBigInteger* const diff = [currentValue subtract:firstDigitPower];
        currentValue = diff;
        digitsCount--;
        result = [result add:currentValue];
    }
    return result;
}

您可以使用以下代碼段進行測試:

JKBigInteger* result = [self sumOfSubValues:[[JKBigInteger alloc] initWithString:@"1234"]];
NSLog(@"%@", result.stringValue); // output is "1506" (1234 + 234 + 34 + 4)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM