2013-05-04 56 views
0

我試圖解決problem 22 from Project Euler,用下面的代碼:奇怪溢出 - Objective-C的

 NSArray *alphabet = [NSArray arrayWithObjects:@"A",@"B",@"C",@"D",@"E",@"F",@"G",@"H",@"I",@"J",@"K",@"L",@"M",@"N",@"O",@"P",@"Q",@"S",@"T",@"U",@"V",@"W",@"X",@"Y",@"Z",nil]; 
    NSError *error = nil; 


    NSString *file = [[NSBundle mainBundle] pathForResource:@"names" ofType:@"txt"]; 
    NSString *names = [[NSString alloc] initWithContentsOfFile: file 
                 encoding: NSASCIIStringEncoding 
                 error: &error]; 


    if (names == nil) { 
     [NSException raise:@"Error reading file :" format:@"%@",error]; 
    } 
    NSMutableArray *namesArray = [NSMutableArray arrayWithArray:[names componentsSeparatedByString:@","]]; 
    unsigned long long int sum = 0; 
    unsigned long long int partSum = 0; 
    for (NSString *str in namesArray){ 
     partSum = 0; 
     for (int i = 0; i < [str length]; i++) { 
      partSum += [alphabet indexOfObject:[NSString stringWithFormat:@"%c",[str characterAtIndex:i]]]+1; 
      NSLog(@"%lli",partSum); 
     } 
     NSLog(@"%@ - %lli",str,partSum); 
     sum += [namesArray indexOfObject:str]*partSum; 
    } 
    NSLog(@"%lli",sum); 

沒有關於獲取名稱爲數組,但問題,當我登錄了sumpartSum變量我得到奇怪的值,如-9223372036854775755。據我所知,這是由於溢出,但是當程序計算的實例名稱看,我得到以下的輸出:

-9223372036854775808 
-9223372036854775805 
-9223372036854775790 
-9223372036854775778 
-9223372036854775769 
-9223372036854775755 
53 
"COLIN" - 53 

第一值然淚下,但最後的結果是奇怪的是正確的(不是所有名字的情況)。爲什麼這樣的溢出?這些數字應該只是3,18,30,39,53。猜測應該是該程序還會處理"字符,並在alphabet中尋找索引。爲此,我在網上看了很多,找不到如何從字符串中刪除它們。我不能只使用[str stringByReplacingOccurrencesOfString:@""" withString:@""]。有什麼建議麼?

回答

0

你的猜測是正確的。在您尋找"時,indexOfObject返回NSNotFound,這是一個值爲MAXINT的常數。然後,正如@rmaddy指出的那樣,你的NSLog正在試圖將那個未經簽名的值作爲已簽名的值打印出來,最後你會得到一個很大的負數。

爲了去除"嘗試

[str stringByReplacingOccurrencesOfString:@"\"" withString:@""]; 
+0

謝謝您的回答,但處理它,但不刪除'「單曲。 – user2331955 2013-05-05 00:26:18

0

unsigned long long的正確格式說明符是llu,而不是llilli將用於簽署long long

順便說一句 - 在我自己的項目中,當你使用不正確的格式說明符時,Xcode會顯示你,並且通常爲你提供正確的格式說明符。

此外,您可以消除字母數組。如果你想有一個1 A和26 Z你可以這樣做:

int letterNum = [str characterAtIndex:i] - 'A' + 1; 
partSum += letterNum; 

此外,您for循環變量應該是一個NSUInteger,不int因爲與NSUIntegerNSString lengthNSString characterAtIndex:工作。

而你的unsigned long long int變量可以是unsigned long longint部分是多餘的。

namesArray可以進行:

NSMutableArray *namesArray = [[names componentsSeparatedByString:@","] mutableCopy];