Ðề: Mặc định Bài toán tính tổng các chữ số trong dãy n số liên tiếp từ 1 tới n
Đây là bài giải :
{________________________________}
PROGRAM Tong_chu_so;
USES crt;
VAR
temp,Skq,num,t:STRING;
r,tmp,i:BYTE;
code:INTEGER;
a,dv:ARRAY[1..19] OF STRING;
PROCEDURE Init;
BEGIN
write('Nhap vao so : ');readln(num);
a[1]:='46';a[2]:='901';a[3]:='13501';a[4]:='180001';a[5]:='2250001';
a[6]:='27000001';a[7]:='315000001';a[8]:='3600000001';a[9]:='40500000001';
a[10]:='450000000001';a[11]:='4950000000001';a[12]:='54000000000001';a[13]:='585000000000001';
a[14]:='6300000000000001';a[15]:='67500000000000001';a[16]:='720000000000000001';
a[17]:='7650000000000000001';a[18]:='81000000000000000001';a[19]:='855000000000000000001';
dv[1]:='1';dv[2]:='3';dv[3]:='6';dv[4]:='10';dv[5]:='15';dv[6]:='21';dv[7]:='28';dv[8]:='36';dv[9]:='45';
END;
FUNCTION Sum(a,b:STRING):STRING;
VAR
x,y,d,top,tmp,k:SHORTINT;
t:STRING;
BEGIN
IF length(b)>length(a) THEN BEGIN t:=b;b:=a;a:=t; END;
insert('0',a,1);
top:=length(a);d:=0; k:=length(a)-length(b);
REPEAT
Val(a[top],x,code);
IF top<=k THEN y:=0
ELSE Val(b[top-k],y,code);
tmp:=x+y+d;
IF tmp>9 THEN BEGIN d:=tmp DIV 10; tmp:=tmp MOD 10; END
ELSE d:=0;
str(tmp,t);a[top]:=t[1];Dec(top);
UNTIL (d=0) AND (top<k);
Sum:=a;
END;
FUNCTION Mul(a,b:STRING):STRING;
VAR
d,x,top,tmp,y:BYTE;
t,out:STRING;
BEGIN
IF length(b)>length(a) THEN BEGIN t:=b;b:=a;a:=t; END;
top:=length(a);d:=0;Val(b,y);Out:='';
REPEAT
val(a[top],x);
tmp:=x*y+d;str(tmp,t);
IF top=1 THEN insert(t,Out,1)
ELSE
BEGIN
IF length(t)>1 THEN BEGIN d:=tmp DIV 10; delete(t,1,1);END
ELSE d:=0;
insert(t,Out,1);
END;
Dec(top);
UNTIL top=0;
Mul:=Out;
END;
BEGIN
clrscr;
Init; skq:='';
Val(num[length(num)],r,code);
IF r>0 THEN skq:=dv[r];
FOR r:=length(num)-1 DOWNTO 1 DO
IF num[r]<>'0' THEN
BEGIN
IF num[r]='1' THEN skq:=sum(skq,a[length(num)-r])
ELSE
BEGIN
Val(num[r],tmp,code);
t:=dv[tmp-1];
FOR i:=1 TO length(num)-r DO t:=t+'0';
Skq:=Sum(skq,Sum(Mul(num[r],a[length(num)-r]),t));
END;
skq:=Sum(skq,Mul(num[r],copy(num,r+1,length(num)-r)));
END;
i:=1; WHILE skq[1]='0' DO delete(skq,1,1);
writeln(skq);
readln
END.