首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >而不是长,小虫?

而不是长,小虫?
EN

Stack Overflow用户
提问于 2015-10-02 16:15:16
回答 2查看 92关注 0票数 0

我是在“谦逊”上表演的(它的内容在下面的链接中)。我不明白它为什么会产生不同的结果:

1) 80%

代码语言:javascript
复制
public int solution(int[] A)
{
    long total = ((2+A.Length)*(A.Length+1)/2);
    long sum=0L;

    for(int i=0;i<A.Length;i++)
    {
        sum+=A[i];
    }

    return (int)(total-sum);
}

2) 100%

代码语言:javascript
复制
public int solution(int[] A)
{
    long N=A.Length+1;
    long total = N*(N+1)/2;
    long sum=0L;

    for(int i=0;i<A.Length;i++)
    {
        sum+=A[i];
    }

    return (int)(total-sum);
}

它似乎将结果处理为System.Int32,它是System.Int64,我已将其签入VS。是窃听器,还是我漏掉了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-02 16:19:46

T[].LengthintT[].LongLengthlong

试试这段代码,其中checked指出算术溢出应该导致异常:

代码语言:javascript
复制
long total = checked((A.Length + 2) * (A.Length + 1) / 2);

您应该得到一个OverflowException,因为即使A.Length不超过int的大小,产品也是如此。当您将代码更改为:

代码语言:javascript
复制
long N = A.Length + 1;
long total = N * (N + 1) / 2;

您现在使用的是long而不是int来进行乘法,这样就没有溢出。

这段代码也能正常工作,即使我更喜欢单独定义N的版本

代码语言:javascript
复制
long total = (A.LongLength + 2) * (A.LongLength + 1) / 2;
票数 4
EN

Stack Overflow用户

发布于 2015-10-02 16:19:31

在这里:

代码语言:javascript
复制
long total = ((2+A.Length)*(A.Length+1)/2);

A.Length是一个int,乘法可以溢出。因此,在结果可能已经溢出后,您将其存储到long

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32911485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档