以下BigInteger计算中的错误是什么?

时间:2015-08-30 14:26:16

标签: java algorithm biginteger

这是我用来计算第一个数字i和第二个数字j之间所有连续数字之和的代码。

 -(void)downloadPdfBtnPressed:(id)sender
{


    NSString *dowloadURL = [DownloadUrlArray objectAtIndex:[sender tag ]];
    NSString *filename =[dowloadURL lastPathComponent];

    NSString *stringPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0]stringByAppendingPathComponent:@"/PDFDownload"];

    if (![[NSFileManager defaultManager] fileExistsAtPath:stringPath])
        [[NSFileManager defaultManager] createDirectoryAtPath:stringPath withIntermediateDirectories:NO attributes:nil error:nil];
    NSData *pdfData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:dowloadURL]];
    if(pdfData)
    {
        stringPath = [stringPath stringByAppendingPathComponent:filename];
        [pdfData writeToFile:stringPath atomically:YES];

        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"PDF"
                                                        message:@"PDF file is downloaded"
                                                       delegate:nil
                                              cancelButtonTitle:@"OK"
                                              otherButtonTitles:nil];
        [alert show];
    }

}

但是对于输入

输入

99 1000000000000

我收到了输出

499999999999499999995149

而不是正确的输出

500000000000499999995149

我哪里错了?

1 个答案:

答案 0 :(得分:9)

你的代码是正确的,问题是你输入了一个奇数和一个偶数,这使得k = i.add(j)中的k是一个奇数,不能被截断而不能截断!

所以BigInteger m = k.divide(BigInteger.valueOf(2));中的m被舍入,这使得你的计算中有1个单位的变化。

只需查看正确的答案,并将其与您的程序打印出的答案进行比较。你有一个1 * 1000000000000(第二个输入值)偏差。这说明问题本身。

如果您输入两个偶数或两个奇数,您的程序将工作并打印正确的答案。

我希望这足以让你找到纠正你的程序的方法,以防偶数和奇数作为输入。