1 条题解
-
0
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
- 上传者