Được gửi bởi
ngoc th
cho mọi người có bài làm : cho dãy số 1,2,2,3,3,3,4,4,4,4,5,5,5,5,5,....
nhập vào số m,n(m<=n<=100000);
in ra tổng a[m]+...+a[n]
Thời gian chạy chương trình không lâu lắm.
For i:=1 to R do < một vài cái gì đó>(R<=447) là tồi tệ lắm rồi.
Ta có thể áp dụng các công thức dãy số lớp 11 vào tính là OK.
__________________________________________________ ___________
Bài này mình chỉ cần dùng công thức để tính ra:
Code:
program code;
var k,h:real;
t,p,l,r:word;
m,n,res:longint;
begin
writeln('Nhap M: '); readln(m);
writeln('Nhap N: '); readln(n);
k:=(sqrt(1+8*m)-1)/2;
t:=trunc(k);
if k>t then t:=t+1;
h:=(sqrt(1+8*n)-1)/2;
p:=trunc(h);
if h>p then p:=p+1;
l:= t*(t+1) div 2 -m+1;
r:=n-(p-1)*p div 2;
res:=t*l+r*p;
p:=p-1;
if t<p then
res:=res+p*(p+1)*(2*p+1) div 6-t*(t+1)*(2*t+1) div 6;
writeln('Ket qua: ',res);
readln;
end.
Còn với cách này thì dễ hiểu hơn, tốc độ cũng nhanh:
Code:
program code;
var di:word;
m,n,i,res:longint;
begin
writeln('Nhap M: '); readln(m);
writeln('Nhap N: '); readln(n);
di:=0;
i:=0;
res:=0;
while i<m do
begin
di:=di+1;
i:=i+di;
end;
res:=(i-m+1)*di;
while i<=n do
begin
di:=di+1;
i:=i+di;
res:=res+di*di;
end;
res:=res-di*(i-n);
writeln('Ket qua: ',res);
readln;
end.
Theo mình thấy thì bài này còn có thể tăng giới hạn lên n<=1 tỉ chạy vẫn tốt, khai báo kiểu dữ liệu lớn hơn, nhưng đối với trình Boland Pascal hay Turbo Pascal thì thế này là đạt giới hạn rồi.
Bookmarks