Mấy cao thủ về thuật toán giúp với

behattieu

Member
Hội viên mới
Em muốn so sánh tổng m số trong 1 dẫy có n phần tử với 1 số khác thì thuật toán thế nào nhỉ? Bác nào quen về thuật toán chỉ giáo 1 cái
 
Ðề: Khó quá, mấy cao thủ về thuật toán giúp với

bạn muốn so sánh tổng m số trong 1 dãy có n phần tử với một dãy số khác tương tự hay là với một số bất kỳ? Mình chỉ nói ý tưởng thế này ko biết đúng ý bạn hok.
Đầu tiên tính tổng của dãy số đó trước. Sau đó đem kết quả đi so sánh.
Bạn cho một vòng For chạy từ phần tử đầu tiên đến n. Nếu không biết giá tri n cụ thể là bao nhiêu bạn sẽ thay vòng For bằng vòng lặp Do..While hoặc While.
Dim s as double
dim i as integer
s=0
for i=0 to n step 1 //n biết cụ thể
s=s+i
next
Sau khi chạy xong biến s sẽ có giá tri là tổng các phần tử trong dãy
bạn đem s đi so sánh với số cần so sánh là ok.
 
Ðề: Khó quá, mấy cao thủ về thuật toán giúp với

bạn muốn so sánh tổng m số trong 1 dãy có n phần tử với một dãy số khác tương tự hay là với một số bất kỳ? Mình chỉ nói ý tưởng thế này ko biết đúng ý bạn hok.
Đầu tiên tính tổng của dãy số đó trước. Sau đó đem kết quả đi so sánh.
Bạn cho một vòng For chạy từ phần tử đầu tiên đến n. Nếu không biết giá tri n cụ thể là bao nhiêu bạn sẽ thay vòng For bằng vòng lặp Do..While hoặc While.
Dim s as double
dim i as integer
s=0
for i=0 to n step 1 //n biết cụ thể
s=s+i
next
Sau khi chạy xong biến s sẽ có giá tri là tổng các phần tử trong dãy
bạn đem s đi so sánh với số cần so sánh là ok.
Nó không đơn giản như vậy đâu. Cái của Trandang viết chỉ là tính tổng cho 1 dãy. Đây là 1 thuật toán tính tổng dãy con trong 1 dãy cho trước. Dãy con gồm m phân tử (m=1:n). Điều này có nghĩa là dãy con có thể là tính tổng của 1 hoặc 2 hoặc 3 hoặc nhiều sỗ bất kỳ trong 1 dãy mà vị trí của các số này là ở các vị trí khác nhau.
 
Ðề: Khó quá, mấy cao thủ về thuật toán giúp với

Nếu nói như vậy thì bạn phải xác định vị trí của dãy con bên trong dãy lớn! giả sử vị trí bắt đầu là k và kết thúc là k' thì bạn cũng cho vòng for thay vì chạy từ đầu, bây h chạy từ vị trí k đến k'!
 
Ðề: Khó quá, mấy cao thủ về thuật toán giúp với

Nếu nói như vậy thì bạn phải xác định vị trí của dãy con bên trong dãy lớn! giả sử vị trí bắt đầu là k và kết thúc là k' thì bạn cũng cho vòng for thay vì chạy từ đầu, bây h chạy từ vị trí k đến k'!

Hi hi, Trang dang vẫn đang nghĩ nó là 1 dãy liên tục phải không? cái dãy con đấy nó gồm các phần tử đan xen nhau. VD ta có 1 dãy có 10 phần tử. Giờ tính tỗng của 5 phần tử trong dãy 10 phần tử đó. Nó không chỉ là (1,2,3,4,5) hoặc (2,3,4,5,6)... mà nó có thể là (1,3,4,5,6), (1,4,6,8,9)...
Do đó mình mới nói là nó phức tạp.
 
Ðề: Khó quá, mấy cao thủ về thuật toán giúp với

Hi hi, Trang dang vẫn đang nghĩ nó là 1 dãy liên tục phải không? cái dãy con đấy nó gồm các phần tử đan xen nhau. VD ta có 1 dãy có 10 phần tử. Giờ tính tỗng của 5 phần tử trong dãy 10 phần tử đó. Nó không chỉ là (1,2,3,4,5) hoặc (2,3,4,5,6)... mà nó có thể là (1,3,4,5,6), (1,4,6,8,9)...
Do đó mình mới nói là nó phức tạp.

Rảnh vào Sài gòn anh hướng dẫn cho, chứ trên diễn đàn đôi khi không thể hiểu hết ý hoặc hiểu mục đích của bài toán.

Thực tế cái mà chú gọi là "thuật toán" này cũng không có gì là phức tạp lắm đâu, tuy nhiên khó giải thích cặn kẽ.
 
Ðề: Khó quá, mấy cao thủ về thuật toán giúp với

Rảnh vào Sài gòn anh hướng dẫn cho, chứ trên diễn đàn đôi khi không thể hiểu hết ý hoặc hiểu mục đích của bài toán.

.
Bác chơi khó em rồi, trc em còn thỉnh thoảng vào công tác, mấy năm gần đây thì thôi rồi. Em nghĩ nó có 1 thuật toán đệ quy nhưng hôm trc hỏi bác Paul thì bác đấy nói nó phải mấy hàng năm mới chạy xong khoảng 1000 record nên hơi choáng.
 
Ðề: Khó quá, mấy cao thủ về thuật toán giúp với

Chà! nếu nói như thế thì po tay lun! Bạn không cho điều kiện nào để xác định 5 số đó nằm ở đâu trong dãy 10 số! Nếu vậy thì 5 số đó random và vị trí cũng random lun! thế thì làm cách nào xác định được dãy số mình cần tính chứ!
Kiểu này khó cho anh em quá!
 
Ðề: Khó quá, mấy cao thủ về thuật toán giúp với

Hi hi, Trang dang vẫn đang nghĩ nó là 1 dãy liên tục phải không? cái dãy con đấy nó gồm các phần tử đan xen nhau. VD ta có 1 dãy có 10 phần tử. Giờ tính tỗng của 5 phần tử trong dãy 10 phần tử đó. Nó không chỉ là (1,2,3,4,5) hoặc (2,3,4,5,6)... mà nó có thể là (1,3,4,5,6), (1,4,6,8,9)...
Do đó mình mới nói là nó phức tạp.

Rảnh quá nên định phát minh lại cái bánh xe?
Muốn làm cái bánh xe thì cứ làm cái bánh xe hình tròn. Khỏi cần suy nghĩ tại sao lại là hình tròn.

Trong các phần mềm thuật toán là đã có sẵn. Chỉ cần gọi ra xài.
Các phần tử trong dãy lớn chỉ cần đưa nó vào thành 1 mảng.
Cộng phần tử nào thì cứ gọi theo chỉ số của nó mà cộng thôi.

---

Cùng lắm thì ở đây chỉ là bài tập thuật toán sắp xếp theo thứ tự mà thôi.
 
Ðề: Khó quá, mấy cao thủ về thuật toán giúp với

Bác mượn ơi quả thật em chưa biết viết cái đoạn code đó thế nào cả. Bác viết cho em đoạn code này đi.
 
Ðề: Khó quá, mấy cao thủ về thuật toán giúp với

Em muốn so sánh tổng m số trong 1 dẫy có n phần tử với 1 số khác thì thuật toán thế nào nhỉ? Bác nào quen về thuật toán chỉ giáo 1 cái
bước đầu tiên bạn cho người dùng nhập (có thể là trong textbox hoặc inputbox) những chỉ số trong dãy A cần tính tổng (những chỉ số này duoc ngăn cách nhau bởi một ký tự đặc biệt, ví dụ như ";") và nhập một số trong dãy A để so sánh với tổng các giá trị trong những chỉ số trên

Ví dụ : một mảng sau A(0)=2; A(1)=4;A(2)=1; A(3)=3;A(4)=0; A(5)=6;
Bạn hãy nhập chỉ số cần tính tổng (textbox1): 0;2;3
Bạn hãy nhập chỉ số cần so sánh (textbox2): 5

dim s as string
dim m as variant
dim tong as integer
dim i as integer
dim temp as integer
dim num as integer

tong=0
m=array()
s=textbox1.value
m=split(s,";")

for i=0 to 2
temp=int(m(i))
tong=tong+A(temp)
next i

num = int(textbox2.value)
if num>tong then
msgbox(" ")
else
msgbox(" ")
end if
 
Ðề: Khó quá, mấy cao thủ về thuật toán giúp với

Nói thật là cái kiểu của behattieu, tôi đã làm qua rồi. :D
Trước đây đã làm cho một số công ty Đài loan, cái cách theo dõi công nợ cũng từa tựa như vậy.
Để tôi tạm mô tả cách làm nhé:
Một chứng từ bán hàng được xem như một "cục nợ". Có nhiều "cục nợ" như thế.
Khi khách hàng trả, họ có thể:

  1. Trả dứt điểm cho mỗi "cục nợ": cái này thì êm không cần bàn vì biết trả cho chứng từ nào.
  2. Trả một phần của một "cục nợ": cái này cũng thế.
  3. Trả một cục tiền, không biết là thanh toán cho "cục nợ" nào, mình phải tự phân bổ lấy: cái này là cái "tương tự" behattieu nói đến nè.
Với trường hợp 3, số tiền có thể ít hơn tổng nợ, bằng tổng nợ. Hiếm khi nhiều hơn (nhưng cũng có thể xảy ra, nếu giả sử khách hàng ứng trước tiền).
Nhiệm vụ là dựa trên số tiền trả (T) đi dò xem còn bao nhiêu chứng từ chưa được thanh toán hết. Nguyên tắc là FIFO: chứng từ xuất trước thì thanh toán trước.
Với chứng từ 1, nếu số tiền nợ (N1) > T thì thanh toán hết cho chứng từ 1. Kết thúc. Chứng từ 1 vẫn chưa thanh toán hết, lần trả sau lại tính tiếp.
Nếu N1 < T thì thanh toán hết cho chứng từ 1. Số tiền còn lại T1 = T - N1 được tính cho chứng từ thứ 2.
Với chứng từ thứ 2 thì cũng tương tự.
Tiếp tục cho đến chứng từ thứ n sao cho Tn = 0 thì xong một phiếu thanh toán (phiếu thu tiền, ủy nhiệm chi, ...)

Nói thế behattieu hiểu chưa vậy?
 
Ðề: Khó quá, mấy cao thủ về thuật toán giúp với

Nói thật là cái kiểu của behattieu, tôi đã làm qua rồi. :D
Trước đây đã làm cho một số công ty Đài loan, cái cách theo dõi công nợ cũng từa tựa như vậy.
Để tôi tạm mô tả cách làm nhé:
Một chứng từ bán hàng được xem như một "cục nợ". Có nhiều "cục nợ" như thế.
Khi khách hàng trả, họ có thể:

  1. Trả dứt điểm cho mỗi "cục nợ": cái này thì êm không cần bàn vì biết trả cho chứng từ nào.
  2. Trả một phần của một "cục nợ": cái này cũng thế.
  3. Trả một cục tiền, không biết là thanh toán cho "cục nợ" nào, mình phải tự phân bổ lấy: cái này là cái "tương tự" behattieu nói đến nè.

Bác phat nói chuẩn. Có thể do em chưa mô tả cụ thể nên moị người chưa hiểu hết được vấn đề. Bác mô tả như thế thì quá rõ ràng về mặt nghiệm vụ rồi.
Tuy nhiên phần sau thì nó thế này:
Nếu "cục tiền" nó trả về đem cộng với tổng của một số cục tiền đã có mà bằng bất kỳ 1 "cục nợ" nào đó thì cục nợ đó và cái cục tiền tổng công vừa rồi coi như là xong==> đánh cho nó 1 ID ghi chú và loại nó ra khỏi vòng lặp tính toán (select... where ID is null).
Nếu bác làm rồi cho em cái đoạn code đi để em xem cách viết đoạn code đấy thế nào . Em nghĩ đây là 1 trong những đoạn code so sánh dữ liệu khá khó về mặt thuật toán vì số phần tử được tăng liên tục. Bác post lên nhé.

PS: Về mặt bài toán nó có thể viết như thế này:
1. Cho 1 table gồm 3 cột PSNo va PSco ID gồm n dòng
2. Với giá trị ID của các dòng hiện đang là Null
3. Bạn hãy tìm cách đánh số ID sao cho tổng của 1 số dòng trong PSNo bằng 1 số bất kỳ trong PSco theo thứ tự từ trên xuống dưới.
 
Sửa lần cuối:
Ðề: Khó quá, mấy cao thủ về thuật toán giúp với

Bác phat nói chuẩn. Có thể do em chưa mô tả cụ thể nên moị người chưa hiểu hết được vấn đề. Bác mô tả như thế thì quá rõ ràng về mặt nghiệm vụ rồi.
Tuy nhiên phần sau thì nó thế này:
Nếu "cục tiền" nó trả về đem cộng với tổng của một số cục tiền đã có mà bằng bất kỳ 1 "cục nợ" nào đó thì cục nợ đó và cái cục tiền tổng công vừa rồi coi như là xong==> đánh cho nó 1 ID ghi chú và loại nó ra khỏi vòng lặp tính toán (select... where ID is null).
Nếu bác làm rồi cho em cái đoạn code đi để em xem cách viết đoạn code đấy thế nào . Em nghĩ đây là 1 trong những đoạn code so sánh dữ liệu khá khó về mặt thuật toán vì số phần tử được tăng liên tục. Bác post lên nhé.

PS: Về mặt bài toán nó có thể viết như thế này:
1. Cho 1 table gồm 3 cột PSNo va PSco ID gồm n dòng
2. Với giá trị ID của các dòng hiện đang là Null
3. Bạn hãy tìm cách đánh số ID sao cho tổng của 1 số dòng trong PSNo bằng 1 số bất kỳ trong PSco theo thứ tự từ trên xuống dưới.

Chú tạo một table "con" cho table hóa đơn bán hàng hay đại loại tên là gì cũng được, có các field: hoadonID (để quan hệ với table hóa đơn), ID (để làm PK cho vui), phieuthanhtoanID, sotien

Khi tính toán cấn trừ, mỗi lần cấn trừ thì insert cho table đó một dòng.

Mỗi lần làm công việc cấn trừ thì SELECT những hóa đơn bán hàng nào mà sotienhoadon - SUM(sotien) > 0. Bắt đầu xử lý tiếp tục.

Nếu hiệu chỉnh hoặc xóa phiếu thanh toán thì cũng cho hiệu chỉnh hoặc xóa trong table "con" đó.

Xong.

P/S: code cụ thể thì không còn. Nên chỉ nói cách làm thôi. Self manage đi chú.
 
Ðề: Mấy cao thủ về thuật toán giúp với

behattieu đặt câu hỏi không rỏ ràng tí nào làm mình hiểu nhầm
 
Ðề: Mấy cao thủ về thuật toán giúp với

Chỉ có khi tính giá trị hàng xuất kho mới cần tính cái đó.
Đối với công nợ thì cần phải có chứng từ, trên đó phải ghi rõ thanh toán cho hóa đơn nào, nếu trên giấy ghi sai thì phải sửa ngay trên chứng từ ấy, ký tá đầy đủ và sau đó cứ theo giấy mà nhập vào máy.
Vì không rành kế toán nên mới nói lấy "cục tiền" này phân phối tùy ý vào "cục nợ" kia.


Ví dụ Cty A nợ ta 10 hóa đơn với tổng tiền là x đồng. Nay A trả y đồng mà không nói là trả cho hóa đơn nào.

- Hỏi lại A tiền y đồng đó là thanh toán cho hóa đơn nào. Giấy tờ thế nào thì ghi nhận y thế đó.
- Nếu kế toán theo dõi theo PP số dư thì không cần phải biết là trả cho hóa đơn nào, chỉ cần biết A còn nợ lại x-y đồng -> không cần tính gì cả.
 
Ðề: Mấy cao thủ về thuật toán giúp với

Chỉ có khi tính giá trị hàng xuất kho mới cần tính cái đó.
Đối với công nợ thì cần phải có chứng từ, trên đó phải ghi rõ thanh toán cho hóa đơn nào, nếu trên giấy ghi sai thì phải sửa ngay trên chứng từ ấy, ký tá đầy đủ và sau đó cứ theo giấy mà nhập vào máy.
Vì không rành kế toán nên mới nói lấy "cục tiền" này phân phối tùy ý vào "cục nợ" kia.


Ví dụ Cty A nợ ta 10 hóa đơn với tổng tiền là x đồng. Nay A trả y đồng mà không nói là trả cho hóa đơn nào.

- Hỏi lại A tiền y đồng đó là thanh toán cho hóa đơn nào. Giấy tờ thế nào thì ghi nhận y thế đó.
- Nếu kế toán theo dõi theo PP số dư thì không cần phải biết là trả cho hóa đơn nào, chỉ cần biết A còn nợ lại x-y đồng -> không cần tính gì cả.

Bác mượn nói đúng, nhưng có một số công ty, nhất là mấy công ty Đài loan, ưa chơi cái trò tự động cấn trừ vậy lắm. Một phần khách hàng làm biếng, một phần kế toán cũng làm biếng, ...
Mà khi người ta yêu cầu mình viết như thế, mình không viết thì lấy gì mà "get money" được. ::noinhiu:
 
Ðề: Mấy cao thủ về thuật toán giúp với

Chú tạo một table "con" cho table hóa đơn bán hàng hay đại loại tên là gì cũng được, có các field: hoadonID (để quan hệ với table hóa đơn), ID (để làm PK cho vui), phieuthanhtoanID, sotien

Khi tính toán cấn trừ, mỗi lần cấn trừ thì insert cho table đó một dòng.

Mỗi lần làm công việc cấn trừ thì SELECT những hóa đơn bán hàng nào mà sotienhoadon - SUM(sotien) > 0. Bắt đầu xử lý tiếp tục.

Nếu hiệu chỉnh hoặc xóa phiếu thanh toán thì cũng cho hiệu chỉnh hoặc xóa trong table "con" đó.

Xong.

P/S: code cụ thể thì không còn. Nên chỉ nói cách làm thôi. Self manage đi chú.

Thực ra cái này của bác dùng để cho nhân viên kế toán thực hiện thường xuyên, em không muốn bàn nhiều về nghiệp vụ kế toán trong bài này , vì rõ ràng nó có vấn đề về mặt này. Đối với anh em mình chỉ cần cho 1 cột "mã hợp đồng" vào chương trình là theo dõi thoải mái muốn gì cũng có.
Bác hãy hình dung hiện nay mình là 1 IT thôi và kế toán đưa cho 1 mình table dữ liệu như em đã nói ở trên. Mình phải tình cách đánh số cho các khoản công nợ sao cho khớp nhau(một cách tương đối).


For i=1 to n
m=i
Khi m chạy từ 1 đến n thì viết công thức tổng m phần tử như thế nào???
Cái vòng lặp chỗ này mới khó

next


 
Sửa lần cuối:
Ðề: Mấy cao thủ về thuật toán giúp với

Phải viết chương trình để cho thằng kế toán nó đánh dấu chọn tờ séc đó là thanh toán cho các hóa đơn nào.
Nếu như trước nay nó không hề làm chuyện đó thì nghĩa là hệ thống kế toán đó theo dõi theo PP số dư. Như vậy không cần làm gì.

Một chương trình viết sẵn để bán thì cần viết cho 2 PP theo dõi. Người dùng sẽ chọn 1 trong 2 PP.

Đó là chuyện quản lý tiền bạc. IT đừng dại nhảy vô lãnh trách nhiệm. Sau này tiền bạc có lộn xộn thì thằng kế toán nó đổ thừa tại IT sao?


Nếu là tính giá trị hàng xuất thì theo 1 trong 4 PP: LIFO, FIFO, BQ và thực tế đích danh.
Các PP đó nó có nguyên tắc của nó. Cứ theo đó mà tính.
Riêng PP thực tế đích danh thì kế toán phải chỉ danh và chịu trách nhiệm. Máy không tự động tính được.

Ví dụ đưa ra thì cũng thực tế chút chứ.
 
Ðề: Mấy cao thủ về thuật toán giúp với

Nó rất thực tế và ác ở chố:
Việc này không phải của em mà của bà xã. Trước đây công nợ do 1 người khác phụ trách giờ người ta chuyển đi (số dư vẫn chưa chấm tí gì cả). Trưởng phòng nó yêu cầu bà xã em phải chấm lại từ đầu trên 1 cái bảng như em đã nói.
Em mà là IT bên đấy thì em chửi rồi (hiện tại vẫn đang chửi nhưng bọn nó không biết :kingkong:)
 

CẨM NANG KẾ TOÁN TRƯỞNG


Liên hệ: 090.6969.247

KÊNH YOUTUBE DKT

Cách làm file Excel quản lý lãi vay

Đăng ký kênh nhé cả nhà

SÁCH QUYẾT TOÁN THUẾ


Liên hệ: 090.6969.247

Top