# GÓC SÁNG TẠO > Khu vực lập trình > Pascal/Delphi/Kylix >  Tính tổng (cần gấp!!!!!!!!!!!!!!!!!)

## phuoc_phuoc5

Cho một số n. Hãy tính tổng:
Vd: n = 12
* Viết liền các số nguyên từ 1 đến n trong hệ thập phân để tạo ra một dãy các chữ số:
Dãy số: 123456789101112
Tổng:=51;
Vd: n = 5
Dãy số:
12345
Tổng:= 15;

Giúp em in ra dãy số nguyên và tính tổng ạ!
Em chỉ biết chuyển dãy số từ 1 đến n thành xâu kí tự nhưng không biết cách cộng các kí tự số trong xâu đó.
Cho em code cách cộng tổng các kí tự số trong xâu với.#-o:bawling::book: /[IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG] [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG])

----------


## myphamuc93

```
Program DienDanTinHoc;
Uses Crt;
Var x,y : String;
     t, n, i : Integer;
BEGIN
   Clrscr;
   Write('Nhap n: '); Readln(n);
   t := 0;
   For i := 1 To n Do
   Begin
      t := t + i;
      Str(i,y); //Biến i thành 1 chuỗi kí tự và gán nó và biến y
      x := x + y; //Sau đó cộng dồn vào biến x
   End;
   Writeln(x); Write(t);
   Readln
END.
```

Chúc bạn học tốt!

----------


## quangminh01

Cám ơn anh "HappySoftGroup" nhiều nhiều nha!:a::a::a::a::a:

----------


## Duyvn

À anh hiểu nhầm đề bài rồi ạ! 
Vd tổng các số nguyên từ 1 đến 5 là
1+2+3+4+5=15
Tổng các số nguyên từ một đến 12 là 
1+2+3+4+5+6+7+8+9+1+0+1+1+1+2
Anh giúp e sửa lại code phần đó nha.:lick::a:[IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]):book:[IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]

----------


## alodienlanh

Hok ai giúp em hả?[IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG][IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG][IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG][IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG][IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG][IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG][IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG][IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG][IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]

----------


## parkhill

```
Program DienDanTinHoc; 
Uses Crt; 
Var x, y : String;     
     t, tam, n, i, err : Integer; 
BEGIN    
   Clrscr;    
   Write('Nhap n: '); Readln(n);    
   t := 0;    
   
   For i := 1 To n Do    
   Begin       
      Str(i,y); //Biến i thành 1 chuỗi kí tự và gán nó vào biến y       
      x := x + y; //Sau đó cộng dồn vào biến x    
   End;
   
   For i := 1 To length(x) Do
   Begin
      Val(x[i],tam,err);
      t := t + tam;
   End;

   Writeln(x); Write(t);    
   Readln 
END.
```

----------


## BRASOL

Bài này em chỉ chạy đúng được 2 test :
1 test 1 chữ số và 1 test 2 chữ số bởi ASCII chỉ có 255 kí tự thôi. Nhập số 5, 12, 60,... thì đúng còn nhập số 123, 2468, 13579, 12481632,... thì chỉ ra kết quả là 1027.
Bài này yêu cầu đến 10 test mà có số rất lớn như: 98765432100123456789 thì tất nhiên là không được. Vậy anh xem có cách nào chuyển được từ chuỗi kí tự sang mảng được không cho dễ cộng. Cho em code luôn nha!
Giúp em với![IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]):lick::book::a::lick:

----------


## vudinh

Mình có một ý tưởng như thế này.
Bạn cho chạy số, mỗi bước chạy đó, bạn sẽ kiểm tra trong số đó có bao nhiêu chữ số 1, 2, ..., 9. Bạn cứ cộng dồn vào cho đến cuối cùng rồi chỉ việc nhân vào là ra kết quả.

----------


## matngoc2015

Giới hạn N bao nhiêu bạn?
Bạn cho đầy đủ các giới hạn giá trị mới có thể xác định được thuật toán [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]
Tạm thời:
Tổng = (1+N)*N/2
Dãy số: in từ từ hoặc dùng ansistring mà lưu. Ngon lành [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]

----------


## secutechvn

Anh viết code giùm em được không? Em vẫn chưa hiểu rõ lắm.

----------


## doken

> Anh viết code giùm em được không? Em vẫn chưa hiểu rõ lắm.


Xin lỗi, mình nhầm, mình hiểu sai đề tưởng là tổng các số từ 1 => N.
Bài như vậy phải dùng ansistring thay cho string. Vì ansistring chứa tối đa (2^31)-1 ký tự

----------


## ta12km

> Xin lỗi, mình nhầm, mình hiểu sai đề tưởng là tổng các số từ 1 => N.
> Bài như vậy phải dùng ansistring thay cho string. Vì ansistring chứa tối đa (2^31)-1 ký tự


 Em đã sử dụng thử ansistring nhưng vẫn không được.
Ban đầu dùng string thì chạy được test n=12, . Bây giờ dùng ansistring thì chỉ được thêm n=123 là đúng thôi
Anh xem còn cách nào nữa không?#-o

----------


## ketoanbacviet79

> Em đã sử dụng thử ansistring nhưng vẫn không được.
> Ban đầu dùng string thì chạy được test n=12, . Bây giờ dùng ansistring thì chỉ được thêm n=123 là đúng thôi
> Anh xem còn cách nào nữa không?#-o


Sao kỳ vậy???, test đến 1000 cũng chưa vượt phạm vi ansistring mà

----------


## seochoikiemgao

Còn cách nào nữa không a[IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]#-o:lick:[IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG])

----------


## seobravolaw

*Code*

Bài này mình làm khai báo xâu S kiểu string nên bạn chỉ chạy được đến số 121 thôi (string gồm 255 kí tự mà!), bạn có thể khai báo s kiểu ansistring như anh Shiro nói!


```
uses crt;
var s1,s:string;
     a,t,i,n:longint;
     code:integer;
begin clrscr;
write('Nhap n:');
readln(N);
s:='';{xau S la xau rong}
for i:=1 to n do 
 begin
  str(i,s1);
  s:=s+s1;
 end;
for i:=1 to length(s) do
 begin
  val(s[i],a,code);
  t:=t+a;
 end;
writeln('Xau: ',s);
write('Tong: ',t);
readln;
end.
```

----------


## galuoi92

Chẳng lẽ không ai giải được bài này hay sao?[IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG])

----------


## zmyr0893

> Chẳng lẽ không ai giải được bài này hay sao?[IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG])


??? Mình bảo dùng ansistring là giải quyết được thôi mà? Nếu không được bạn nói xem sai thế nào?

----------


## yeuyeu90

Nhưng mà nhập số 2468, 13579,..., lớn hơn thì không được.
Với lại kiểu ansistring chỉ có trong free pascal thôi còn turbo pascal đâu có. Đi thi lỡ nó bắt sài có turbo pascal thì sao anh?
Chỉ còn cách tạo một file 'tam' chứa các số nguyên từ 1->n 
Vd
tong.inp
n=2468
tong.out
73924
tam.out
1234567891011121314151617181920...2468 rồi cộng vào.
Anh thử suy nghĩ theo hướng này xem.:book:

----------


## mcqueen

> Nhưng mà nhập số 2468, 13579,..., lớn hơn thì không được.
> Với lại kiểu ansistring chỉ có trong free pascal thôi còn turbo pascal đâu có. Đi thi lỡ nó bắt sài có turbo pascal thì sao anh?
> Chỉ còn cách tạo một file 'tam' chứa các số nguyên từ 1->n 
> Vd
> tong.inp
> n=2468
> tong.out
> 73924
> tam.out
> ...


 Việc tạo file sẽ phá vỡ quá trình chấm tự động trong các kỳ thi chấm máy (bây giờ là như vậy). Việc tạo file gọi là sử dụng bộ nhớ ảo.
Đi thi bây giờ đã chuyển đổi tất cả là FPC không còn chuyện TurboPascal.
Bạn nói 2468 vượt ansistring??? Thậm chí nó còn không vượt string kia kìa, hay bạn đề cập đến việc lưu toàn bộ 1->N vào 1 chuỗi??? 
Đề yêu cầu in ra 1 chuỗi số như vậy, không có nghĩa ta cần cả chuỗi, in liền nhau là được. Dùng ansistring là vì khi nhập test lớn hơn 19 chữ số thì còn xài được (nhưng vẫn chẳng biết giới hạn bạn cho bao nhiêu [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG] )

----------


## dathoaonline

Đây là nguyên văn bài thi
*Tổng các chữ số*
Cho số nguyên dương n. VIết các số nguyên liên tiếp từ 1 tới n trong hệ thập phân để tạo ra một dãy các chữ số. Hãy tính tổng các chữ số của dãy.

Ví dụ : với n = 12, ta có dãy chữ số 123456789101112 với tổng là 51.

test 1 : n = 12
test 2 : n = 123
test 3 : n = 2468
test 4 : n = 13579
test 5 : n = 12481632
test 6 : n = 123456789
test 7 : n = 9876543210
test 8 : n = 123123123123
test 9 : n = 123456789123456789
test 10: n = 98765432100123456789
test 10 đến 20 chữ số. Nếu viết từ 1->98765432100123456789 thì sao đủ?

----------


## poodle

> Đây là nguyên văn bài thi
> *Tổng các chữ số*
> Cho số nguyên dương n. VIết các số nguyên liên tiếp từ 1 tới n trong hệ thập phân để tạo ra một dãy các chữ số. Hãy tính tổng các chữ số của dãy.
> 
> Ví dụ : với n = 12, ta có dãy chữ số 123456789101112 với tổng là 51.
> 
> test 1 : n = 12
> test 2 : n = 123
> test 3 : n = 2468
> ...


Híc [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]
Bạn không hiểu ý tớ thì phải
In ra như vậy đâu nhất thiết phải in ra chuỗi có chứa bấy nhiêu chữ số, ta chỉ cần dùng thủ thuật đơn giản sau đây:


```
for i:=1 to n do
     write(f,i);
```

Số N ở đây có ý nghĩa giống như N của bạn trong đề bài. Dùng ansistring là bởi lẽ, khi tính tổng chữ số của 1 dãy số nào đó mà nó vượt cả int64, thì ta chuyển qua dùng phương pháp xử lý số lớn bằng cấu trúc mảng hoặc chuỗi. Theo đề bạn đưa ra thì không cần dùng đến ansistring, chỉ cần dùng đến string. Vì riêng string đã chứa đến số N có 255 chữ số rồi.

----------


## dangnguyencctv

Lúc đầu em cũng nghĩ đến cách in: 

for i:=1 to n do 
----write(f,i);
Nhưng thầy em bảo dùng xâu cho dễ, sau đó cải tiến thành file. Bài này 10 test mà chạy được đến test 5 là ok rồi. Lấy giải KK thôi.
Anh nói không cần dùng xâu chỉ cần in ra:

for i:=1 to n do 
----write(f,i);
Vậy anh cho code toàn bài {gồm xuất và cộng các chữ số 1->n} luôn nha. Để em hỏi thầy xem sao.:lick:

----------


## tungcar2084

> Lúc đầu em cũng nghĩ đến cách in: 
> 
> for i:=1 to n do 
> ----write(f,i);
> Nhưng thầy em bảo dùng xâu cho dễ, sau đó cải tiến thành file. Bài này 10 test mà chạy được đến test 5 là ok rồi. Lấy giải KK thôi.
> Anh nói không cần dùng xâu chỉ cần in ra:
> 
> for i:=1 to n do 
> ----write(f,i);
> Vậy anh cho code toàn bài {gồm xuất và cộng các chữ số 1->n} luôn nha. Để em hỏi thầy xem sao.:lick:


Việc cộng 2 chuỗi số bạn tham khảo thêm trong box, chỉ là cộng từ phần tử cuối cộng lên có nhớ thôi.
Việc xuất thì như code mình nêu trên.
Bạn thi gì mà lấy giải KK mà cho cả test ra thế này...

----------


## trangna

Sửa giùm em code bài này với


```
Type
dayso=array[1..1000] of longint;
Var
a:dayso;
k,l:string;
j,i,n,s,e,tam,o:integer;
fi,fo,f:text;
Procedure Init;
Begin
Assign(fi,'Number0.inp');
Assign(fo,'Number0.out');
Assign(f,'Tam00.out');
Reset(fi);
Rewrite(fo);
End;
Procedure Enter;
Begin
Readln(fi,n);
End;
Procedure Solve;
Begin
s:=02;
l:='';
k:='';
tam:=0;
s:=0;
For i:=1 to n do
Begin
str(i,k);
l:=l+k;
For j:=1 to length(l) do
   write(f,l[i]);
End;
Reset(f);
o:=0;
While not eof(f) do
Begin
inc(o);
Read(f,a[o]);
End;
For I:=1 to n do
s:=s+a[i];
Write(fo,s);
End;
Procedure Thoat;
Begin
Readln;
Close(fi);
Close(fo);
Close(f);
End;
Begin
Init;
Enter;
Solve;
Thoat;
End.
```

----------


## greenhome

Bạn đưa code nhưng không nói đề bài hay ý tưởng gì hết thì sao biết đường đâu mà lần.
Bạn khắc phục nha!

----------


## kientrogia24h

Đây là nguyên văn bài thi
*TỔNG CÁC CHỮ SỐ*
Cho số nguyên dương n. VIết các số nguyên liên tiếp từ 1 tới n trong hệ thập phân để tạo ra một dãy các chữ số. Hãy tính tổng các chữ số của dãy.

Ví dụ : với n = 12, ta có dãy chữ số 123456789101112 với tổng là 51.

test 1 : n = 12
test 2 : n = 123
test 3 : n = 2468
test 4 : n = 13579
test 5 : n = 12481632
test 6 : n = 123456789
test 7 : n = 9876543210
test 8 : n = 123123123123
test 9 : n = 123456789123456789
test 10: n = 98765432100123456789

Ý tưởng:
0. Ngoài việc tạo file inp và file out còn tạo thêm file Tam.out(bộ nhớ ảo)
1. Đầu tiên chuyển dãy số từ 1->n sang chuỗi.
2. Đọc chuỗi vào file tạm.
3. Đọc dữ liệu từ file tạm vào mảng.
4. Cộng các phần tử của mảng.

----------


## thangvigreenland

> Sửa giùm em code bài này với
> 
> 
> ```
> Type
> dayso=array[1..1000] of longint;
> Var
> a:dayso;
> k,l:string;
> ...


Code của bạn ghi ra file theo liền mạch, việc khai báo phần tử a_ thuộc longint, khi đọc máy sẽ tính các phần tử liền nhau là 1 số => vượt longint.
Vì vậy bạn cần cải thiện bằng cách vừa in file vừa tính tổng, bỏ việc khai báo mảng A [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]_

----------


## mrti

Thật ra cũng không cần dùng đến mảng. Chỉ việc đọc vào string rồi xử lí là ok. Bởi vì 1 số cũng không quá 256 chữ số.

----------


## lovegoogle

> Thật ra cũng không cần dùng đến mảng. Chỉ việc đọc vào string rồi xử lí là ok. Bởi vì 1 số cũng không quá 256 chữ số.


 Nhưng mà số từ 1 -> n, test 10: n=98765432100123456789
Nối lại chắc dài hơn 256 kí tự rồi.

----------


## ndk2303

> Nhưng mà số từ 1 -> n, test 10: n=98765432100123456789
> Nối lại chắc dài hơn 256 kí tự rồi.


Bạn sai lầm ở chỗ này. Sinh ra số nào, lưu số đấy vào file rồi xử lí liền chứ đừng có nối thành 1 cục rồi mới xử lí. Làm như vậy tốn thời gian lắm! Nó cũng khắc phục được vấn đề kiểu dữ liệu.

----------


## seocuchuoi

> Nhưng mà số từ 1 -> n, test 10: n=98765432100123456789
> Nối lại chắc dài hơn 256 kí tự rồi.


Híc, mình nói hoài bạn vẫn không hiểu ý mình.
*KHÔNG NỐI LẠI*
Việc dùng string là khi số đó vượt qua 30 chữ số (int64).
Xét 1 số làm 2 việc:
+ In
+ Cộng tổng.
Đâu có bắt bạn nối lại để làm gì đâu????

----------


## hangngand

Thực ra những cách làm trên chỉ sử dụng sức mạnh của máy tính. Vì vậy chỉ có thể tính được một vài số thôi. Còn thuật toán do con người nghĩ ra có thể tính được những số rất lớn. 
Từ đề bài, ta có nhận xét:
Từ 1 ->9 có khoảng một số một, hai số 2,..
Từ 10 -> 100 có khoảng 20 số 1; ... số 2; .. số 3;...
Từ 100 -> 1000 có bao nhiêu số 1, 2, 3...
Cứ như vậy mà ta tìm ra quy luật của nó và chuyển thành thuật toán.
Những cách làm của Shiro, HappSoftGroup,... nói chung là cũng được nhưng nó còn thủ công quá...!! :lick: Nó chỉ đúng theo yêu cầu bài thôi chứ theo thuật toán thì...[IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG])

----------


## myphamchatluong

> Thực ra những cách làm trên chỉ sử dụng sức mạnh của máy tính. Vì vậy chỉ có thể tính được một vài số thôi. Còn thuật toán do con người nghĩ ra có thể tính được những số rất lớn. 
> Từ đề bài, ta có nhận xét:
> Từ 1 ->9 có khoảng một số một, hai số 2,..
> Từ 10 -> 100 có khoảng 20 số 1; ... số 2; .. số 3;...
> Từ 100 -> 1000 có bao nhiêu số 1, 2, 3...
> Cứ như vậy mà ta tìm ra quy luật của nó và chuyển thành thuật toán.
> Những cách làm của Shiro, HappSoftGroup,... nói chung là cũng được nhưng nó còn thủ công quá...!! :lick: Nó chỉ đúng theo yêu cầu bài thôi chứ theo thuật toán thì...[IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG])


Kaka, bạn lầm to. Đọc chưa hết mà đã nói rồi! Cách này mình đề cử trước nhá! Xin mời bạn đọc lại!

----------


## chautuanpro91

à, cách làm này hay đấy. Cho em xin code với.

----------


## parkhill

> Thực ra những cách làm trên chỉ sử dụng sức mạnh của máy tính. Vì vậy chỉ có thể tính được một vài số thôi. Còn thuật toán do con người nghĩ ra có thể tính được những số rất lớn. 
> Từ đề bài, ta có nhận xét:
> Từ 1 ->9 có khoảng một số một, hai số 2,..
> Từ 10 -> 100 có khoảng 20 số 1; ... số 2; .. số 3;...
> Từ 100 -> 1000 có bao nhiêu số 1, 2, 3...
> Cứ như vậy mà ta tìm ra quy luật của nó và chuyển thành thuật toán.
> Những cách làm của Shiro, HappSoftGroup,... nói chung là cũng được nhưng nó còn thủ công quá...!! :lick: Nó chỉ đúng theo yêu cầu bài thôi chứ theo thuật toán thì...[IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG])


Ừm đây là việc toán học hóa công thức hoá 1 bài toán tin, nhưng mình liệu hỏi việc bạn khai thác sức mạnh máy tính với thuật toán xử lý số lớn và kết hợp kiểu dữ liệu chuỗi (string trong pascal) với việc bạn công thức hoá bài toán thì có điểm gì ưu và nhược?
Xin đáp:
Ưu điểm công thức hoá: độ phúc tạp nói chung là O(1) hằng số => cực kỳ tốt cho những bài không nghĩ ra thuật toán hoặc độ phức tạp quá cao ( hàm mũ , cấp số nhân ... )
Nhược: việc công thức hoá không phải lúc nào cũng thành công, việc chứng minh công thức cũng không phải là vấn đề cho phép về mặt thời gian. Chỉ khi những công thức được thừa nhận thì cách này tỏ ra vô cùng hữu hiệu.
Xin bạn xem lại [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]

----------


## tungldhdonga1

Trước kia thi pascal, muốn áp dụng một công thức mới, họ phải chứng minh cho ra công thức rồi mới được dùng. Hiện nay thì thoáng hơn một tí!

----------


## ngocbich231

*asdf*

bài này giải được test 12 và 123 còn các test từ 2468 trở lên thì pascal tự thoát.
ai bit thì chỉ? nhé.
program tong_day_so;
var
i,j,n,m,k,l:longint;
fi,fi1,fo:text;
s,s1,s2:string;
a:array[1..100] of longint;
function tostr(i: Longint): String;
var
S: string[11];
begin
Str(i,s);
tostr := s;
end;
begin
assign(fi,'tds.inp');
reset(fi);
n:=0;
i:=0;
while not(eof(fi))=true do
begin
inc(i);
read(fi,a_);
s:=s+tostr(a);
inc(n)
end;
close(fi);
l:=0;
{ if n<100000000 then}
for i:=1 to n do
l:=l+a;
assign(fo,'tds.out');
rewrite(fo);
writeln(fo,s);
writeln(fo,l);
close(fo);
end.

còn đây là program tao file:
program tao_file;
var
i,j,m,n:longint;
fo:text;
s,k:string;
function tostr(i: Longint): String;
var
S: string[11];
begin
Str(i,s);
tostr := s;
end;
begin
assign(fo,'tds.inp');
rewrite(fo);
writeln('nhap n:');
readln(n);
for i:=1 to n do
begin
k:=tostr(i);
for j:=1 to length(k) do
writeln(fo,k[j]);
end;
close(fo);
end.
:book::book::book::book::book::book::book::book::b  ook::book:
nhớ thank nhé! cảm ơn nhìu![IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG][IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG][IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG][IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG][IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG][IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG][IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG][IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG][IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]_

----------


## samnguyen

> bài này giải được test 12 và 123 còn các test từ 2468 trở lên thì pascal tự thoát.
> ai bit thì chỉ? nhé.
> program tong_day_so;
> var
> i,j,n,m,k,l:longint;
> fi,fi1,fo:text;
> s,s1,s2:string;
> a:array[1..100] of longint;
> function tostr(i: Longint): String;
> ...


_
Đề nghị bạn đặt code trong thẻ


```
. 
Chúc bạn vui vẻ!
```

_

----------


## hoangchuot

*đang chán đời dc mỗi giải 3 reply (29/3/2011)*

tui thấy bài này có j` đâu khá dễ vấn đề ở đây là dữ liệu lớn như vậy cái tổng minh sẽ cho nó là int64 hay Qword thì cũng dc cái này quan trọng nè là mình sẽ tự tạo các số trong chữ số thập phân. 
while (s<>kq) do {kq là giới hạn của dãy min` mun' tính string nhaz}
begin
d:=0;
for i:=length(S) downto 1 do {xét từ cuối dãy trở lên}
if not kt then 
begin
a:=ord(s_)-47+d;{ d là biến nhớ lại nếu như s='9' thì d=1 }
s:=chr( a mod 10 + 48 );
d:=a div 10;
kt:=d=0;
sum:=sum+(a mod 10);{sum là biến tổng}
if (i=1) and (not kt) then begin s:='1'+s; sum:=sum+1; end;
end;
end;
đấy xong rùi nhưng muh` cách này vẫn chưa hay mình đang nghĩ dến cách tạo = mảng boolean nhưng giờ vẫn chưa ra [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG] thui đang thất vọng cấp Tp min` có hạng 3 ah` phải nhất mới đấy_

----------

