1 条题解

  • 0
    @ 2025-10-10 19:52:12

    C++ :

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    /*
    思路:枚举左右两个端点的所有可能
    */
    int n,ans=0;//ans记录左端点l到右端点r的区间和
    int main(){
        scanf("%d",&n);
        int l=1;
        for (int r=1;r<n;r++)//因为题目要求是自然数段,所以不能有n到n的区间
        {
          ans+=r;//ans一直加上右端点的数,记录l到r的区间的和
          while (ans>n)
              ans-=l++;//如果ans加得太多,从左端点开始减,当ans<=n的时候就可以继续枚举右端点,还要注意l的细节问题,当ans减去l后,l还要加1,举样例来说,如果ans-17等于n了,l还要加1等于18,当然,l要从1开始枚举
          if (ans==n)
            printf("%d %d\n",l,r);//ans等于n,输出左右端点
        }
        return 0;
    }
    

    Pascal :

    var
    n,p,s,i:longint;
    begin
    read(n);
    for i:=1 to n div 2+1 do
    begin
    s:=0;
    p:=i;
    repeat
    s:=s+p;
    p:=p+1;
    if s=n then
    begin
    write(i,' ',p-1);
    writeln;
    break;
    end;
    until s>n-p;
    end;
    end.
    
    • 1

    信息

    ID
    1038
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者