0

次のコードを使用して、Project Eulerの問題 22 を解決しようとしていました。

        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:@""]。助言がありますか?

4

2 に答える 2

0

あなたの推測は正しいです。"thenをindexOfObject探した時点でNSNotFound、値を持つ定数ですMAXINT。次に、@rmaddyが指摘したように、NSLogはそのunigned値をsigned値として出力しようとしているため、最終的に大きな負の数になります。

"トライを外すには

[str stringByReplacingOccurrencesOfString:@"\"" withString:@""];
于 2013-05-05T00:05:55.407 に答える