CÁch tính tổng các số trong một số! (1 người xem)

  • Thread starter Thread starter aduc
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

aduc

Thành viên chính thức
Tham gia
25/3/08
Bài viết
82
Được thích
60
Nghề nghiệp
Ki su thiet ke xay dung
Mình muốn hỏi thuật toán tính tống các chữ số trong một số?
Xin mọi người giúp đỡ.
 
Mình muốn hỏi thuật toán tính tống các chữ số trong một số?
Xin mọi người giúp đỡ.
Ý bạn là sao? Có phải như thế này không?
Giả sử:
Ô [A1] = 12345678
Ô [B1] cần tính = 1+2+3+4+5+6+7+8 = 36

Nếu đúng vậy thì dùng công thức sau:
PHP:
B1 = SUMPRODUCT(--MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))
 
Đối với một bài toán thông thường. Thuật toán chung để giải quyết bài toán này là thế nào?
Bạn có thể cho ý kiến không?
 
Đối với một bài toán thông thường. Thuật toán chung để giải quyết bài toán này là thế nào?
Bạn có thể cho ý kiến không?
Thuật toán là: tách từng ký tự một trong chuỗi số đó ra (dùng hàm MID), chuyển nó thành số (vì hàm MID trả về giá trị là Text) và cho vào một mảng, sau đó SUM tất cả các phần tử trong mảng đó lại! dùng SUM (phải ctrl+Shift+Enter) hoặc SUMPRODUCT
 
Điều đó thì tất nhiên. Mình hỏi ví dụ dùng vba. Thì phải làm thế nào?
Bạn có thể giúp mình không?

Ý mình là có thể sử dụng thuật toán này cho các chương trình ngôn ngữ lập trình nói chung. Mong mọi người chỉ giúp.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Ý bạn là sao? Có phải như thế này không?
Giả sử:
Ô [A1] = 12345678
Ô [B1] cần tính = 1+2+3+4+5+6+7+8 = 36

Nếu đúng vậy thì dùng công thức sau:
PHP:
B1 = SUMPRODUCT(--MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))

Anh giải thích giúp em công thức trên với. Em quét đoạn
Mã:
INDIRECT("1:"&LEN(A1))
rồi nhấn F9 nó báo là
là sao hả anh?
 
Điều đó thì tất nhiên. Mình hỏi ví dụ dùng vba. Thì phải làm thế nào?
Bạn có thể giúp mình không?
Dùng VBA cũng thế thôi!
Bạn xem đoạn code này xem sao:
[highlight=vb]
Function mSUM(Rng As Range) As Double
Dim iR As Long
For iR = 1 To Len(Rng)
mSUM = mSUM + Val(Mid(Rng, iR, 1))
Next iR
End Function
[/highlight]
 
Anh giải thích giúp em công thức trên với. Em quét đoạn
Mã:
INDIRECT("1:"&LEN(A1))
rồi nhấn F9 nó báo là Formula is too long là sao hả anh?
Indirect("1:"& LEN(A1)) phải đặt trong hàm ROW nó mới có nghĩa.
ROW(Indirect("1:"& LEN(A1)))

Bạn thử ví dụ sau:
Row(1:1) = {1}
Row(1:2) = {1,2}
Row(1:3) = {1,2,3}
Row(1:n) = {1,2,3,....,n}
Vì ta không biết trước độ dài của chuỗi số là bao nhiêu nên cái n đó thay bằng LEN(chuỗi số) và ta không thể viết là:
Mà phải dùng Indirect để chuyển text thành giá trị tham chiếu

Còn việc excel báo lỗi Formula is too long là do giới hạn số lượng ký tự trong 1 cell (cái này có nói trên diễn đàn).
bạn thử dùng Indirect("1:1") nó sẽ liệt kê ra hết các giá trị tại dòng 1
Indirect("1:5") ==> excel báo tràn dữ liệu ==> formula is too long.

Không biết mình giải thích vậy được không nữa!
 
Lần chỉnh sửa cuối:
Ý bạn là sao? Có phải như thế này không?
Giả sử:
Ô [A1] = 12345678
Ô [B1] cần tính = 1+2+3+4+5+6+7+8 = 36

Nếu đúng vậy thì dùng công thức sau:
PHP:
B1 = SUMPRODUCT(--MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))

Mình muốn hỏi 1 chút, ở đây bạn dùng SUMPRODUCT có phải là với mục đích chuyển cả hàm ROW đó thành 1 mảng {1,2,3,4,5,6,7,8} hay không, mình thử với SUM cũng cho ra cùng kết quả nhưng phải kết thúc với Ctrl Shift Enter, còn công thức của bạn thì chỉ cần nhấn Enter thôi.
 
Mình muốn hỏi 1 chút, ở đây bạn dùng SUMPRODUCT có phải là với mục đích chuyển cả hàm ROW đó thành 1 mảng {1,2,3,4,5,6,7,8} hay không, mình thử với SUM cũng cho ra cùng kết quả nhưng phải kết thúc với Ctrl Shift Enter, còn công thức của bạn thì chỉ cần nhấn Enter thôi.
Đúng vậy, bản chất của SUMPRODUCT là một hàm mảng rồi, cho nên khi dùng nó ta không cần ấn Ctrl+Shift+Enter. Còn hàm SUM thì không phải hàm mảng nên ta phải dùng tổ hợp phím trên!
 
Cho mình xin link bài viết về sự khác nhau khi nhấn tổ hợp phím ctrl+shift+enter và Enter với.
Vì thời gian không có nhìu và không bít cách searh bài như thế nào nên bạn giúp mình với.
Thanks.
 
Cho mình xin link bài viết về sự khác nhau khi nhấn tổ hợp phím ctrl+shift+enter và Enter với.
Vì thời gian không có nhìu và không bít cách searh bài như thế nào nên bạn giúp mình với.
Thanks.

Khi kết thúc 1 công thức bình thường ta dùng Enter ví dụ: =SUM(A1:B3) => tính tổng các số trong mảng A1:B3, kết quả chỉ là 1 số. Tổ hợp Ctrl Shift Enter dùng để kết thúc 1 công thức mảng. Lấy ví dụ đơn giản, ta có bảng tính dưới đây :

attachment.php


Có 1 mảng trong vùng C3:D5, ta chọn vùng F3:G5 cùng kích thước với vùng C3:D5, sau đó nhập =C3:D5, nhấn Ctrl Shift Enter hai dấu {} sẽ được tự động thêm vào, vậy kết quả trả về trong vùng F3:G51 mảng có các giá trị như trong C3:D5. Bạn sử dụng chức năng tìm kiếm của diễn đàn với từ khoá "công thức mảng" để nghiên cứu thêm nhé.
 

File đính kèm

  • 1.jpg
    1.jpg
    25.3 KB · Đọc: 118
Lần chỉnh sửa cuối:
tổng các số đến tận cùng

Đúng vậy, bản chất của SUMPRODUCT là một hàm mảng rồi, cho nên khi dùng nó ta không cần ấn Ctrl+Shift+Enter. Còn hàm SUM thì không phải hàm mảng nên ta phải dùng tổ hợp phím trên!

Các bạn giúp mình tính tổng các số trong một số sao cho đến kết quả cuối cùng còn một chữ số.
Ví dụ như : cho số 214598
thì sẽ cộng như sau : 2+1+4+5+9+8=29
tiếp 2+9=11
tiếp 1+1=2
như vậy mới kết thúc.
dùng VBA nhé
Cám ơn các bạn
 
Các bạn giúp mình tính tổng các số trong một số sao cho đến kết quả cuối cùng còn một chữ số.
Ví dụ như : cho số 214598
thì sẽ cộng như sau : 2+1+4+5+9+8=29
tiếp 2+9=11
tiếp 1+1=2
như vậy mới kết thúc.
dùng VBA nhé
Cám ơn các bạn
Dùng công thức được không?
Giả sừ bạn gõ số gì đó tại A1 thì yêu cầu của bạn có thể thực hiện bằng công thức thế này tại B1:
=MOD(A1-1,9)+1
Chắc vậy! Và đương nhiên chỉ tính số nguyên thôi nha
Thử xem... Ẹc... Ẹc...
 
Dùng công thức được không?
Giả sừ bạn gõ số gì đó tại A1 thì yêu cầu của bạn có thể thực hiện bằng công thức thế này tại B1:
=MOD(A1-1,9)+1
Chắc vậy! Và đương nhiên chỉ tính số nguyên thôi nha
Thử xem... Ẹc... Ẹc...
Nếu em nhập vào A1 số 0 thì... tèo :-=
 
Thuật toán nói chung là bạn lấy số cần tính chia cho 10 lấy số dư và thương. Số dư gán vào 1 biến X chả hạn.
Tiếp tục lấy thương chia cho 10 để lấy số dư và thương mới. Cộng tiếp số dư mới vào X. Cứ làm vậy đến khi kết quả phép chia bằng 0.
Ví dụ số 123.
123/10 = 12 du 3. X=3
12/10=1 du 2. X=3+2=5
1/10=0 ( kết thúc vòng lặp) du 1. X=5+1=6.
Không biết có cách nào nhanh hơn không.
 
Ý bạn là sao? Có phải như thế này không?
Giả sử:
Ô [A1] = 12345678
Ô [B1] cần tính = 1+2+3+4+5+6+7+8 = 36

Nếu đúng vậy thì dùng công thức sau:
PHP:
B1 = SUMPRODUCT(--MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))



Em muốn hỏi chút ạ:
Ví dụ dãy số của e trong ô A1 hiển thị thế này: 1-2-5-1-3-4-2-1
Bây giờ e muốn cộng kiểu tịnh tiến dãy số trên thì làm thế nào ạ?
Cộng tịnh tiến bằng tay thì dãy số trên sẽ ra là 1-3-8-9-12-16-18-19

Em cảm ơn nhiều ạ!
Bài đã được tự động gộp:

Mình muốn hỏi 1 chút, ở đây bạn dùng SUMPRODUCT có phải là với mục đích chuyển cả hàm ROW đó thành 1 mảng {1,2,3,4,5,6,7,8} hay không, mình thử với SUM cũng cho ra cùng kết quả nhưng phải kết thúc với Ctrl Shift Enter, còn công thức của bạn thì chỉ cần nhấn Enter thôi.

Em muốn hỏi chút ạ:
Ví dụ dãy số của e trong ô A1 hiển thị thế này: 1-2-5-1-3-4-2-1
Bây giờ e muốn cộng kiểu tịnh tiến dãy số trên thì làm thế nào ạ?
Cộng tịnh tiến bằng tay thì dãy số trên sẽ ra là 1-3-8-9-12-16-18-19

Em cảm ơn nhiều ạ!
Bài đã được tự động gộp:

Dùng công thức được không?
Giả sừ bạn gõ số gì đó tại A1 thì yêu cầu của bạn có thể thực hiện bằng công thức thế này tại B1:
=MOD(A1-1,9)+1
Chắc vậy! Và đương nhiên chỉ tính số nguyên thôi nha
Thử xem... Ẹc... Ẹc...


Em muốn hỏi chút ạ:
Ví dụ dãy số của e trong ô A1 hiển thị thế này: 1-2-5-1-3-4-2-1
Bây giờ e muốn cộng kiểu tịnh tiến dãy số trên thì làm thế nào ạ?
Cộng tịnh tiến bằng tay thì dãy số trên sẽ ra là 1-3-8-9-12-16-18-19

Em cảm ơn nhiều ạ!
 
Em muốn hỏi chút ạ:
Ví dụ dãy số của e trong ô A1 hiển thị thế này: 1-2-5-1-3-4-2-1
Bây giờ e muốn cộng kiểu tịnh tiến dãy số trên thì làm thế nào ạ?
Cộng tịnh tiến bằng tay thì dãy số trên sẽ ra là 1-3-8-9-12-16-18-19

Em cảm ơn nhiều ạ!
Bài đã được tự động gộp:



Em muốn hỏi chút ạ:
Ví dụ dãy số của e trong ô A1 hiển thị thế này: 1-2-5-1-3-4-2-1
Bây giờ e muốn cộng kiểu tịnh tiến dãy số trên thì làm thế nào ạ?
Cộng tịnh tiến bằng tay thì dãy số trên sẽ ra là 1-3-8-9-12-16-18-19

Em cảm ơn nhiều ạ!
Bài đã được tự động gộp:




Em muốn hỏi chút ạ:
Ví dụ dãy số của e trong ô A1 hiển thị thế này: 1-2-5-1-3-4-2-1
Bây giờ e muốn cộng kiểu tịnh tiến dãy số trên thì làm thế nào ạ?
Cộng tịnh tiến bằng tay thì dãy số trên sẽ ra là 1-3-8-9-12-16-18-19

Em cảm ơn nhiều ạ!
PHP:
Public Function fGpe(ByVal Txt As String, Byval Deli As String) As String
Dim j As Long, N As Long, Tmp
    Tmp = Split(Txt, Deli)
    N = Tmp(0)
    fGpe = N
If UBound(Tmp) > 0 Then
    For j = 1 To UBound(Tmp)
        N = N + Tmp(j)
        fGpe = fGpe & Deli & N
    Next j
End If
End Function
A1= '1-2-3-4-5-6-7-8-9
PHP:
B1= fGpe(A1;"-")
 
PHP:
Public Function fGpe(ByVal Txt As String, Byval Deli As String) As String
Dim j As Long, N As Long, Tmp
    Tmp = Split(Txt, Deli)
    N = Tmp(0)
    fGpe = N
If UBound(Tmp) > 0 Then
    For j = 1 To UBound(Tmp)
        N = N + Tmp(j)
        fGpe = fGpe & Deli & N
    Next j
End If
End Function
A1= '1-2-3-4-5-6-7-8-9
PHP:
B1= fGpe(A1;"-")


Thầy ơi!
E đã add đoạn code trên vào Visual basic và sử dụng hàm" fGpe" theo hướng dẫn của thầy nhưng vẫn không ra kết quả ạ. Thầy xem lại giúp e với ạ!
E hỏi thêm nữa là trên Google trang tính có add được code vào không ạ?
E cảm ơn nhiều!s1.PNGs2.PNGs3.PNG
 
Thầy ơi!
E đã add đoạn code trên vào Visual basic và sử dụng hàm" fGpe" theo hướng dẫn của thầy nhưng vẫn không ra kết quả ạ. Thầy xem lại giúp e với ạ!
E hỏi thêm nữa là trên Google trang tính có add được code vào không ạ?
E cảm ơn nhiều!View attachment 219689View attachment 219690View attachment 219691
Bạn chỉnh công thức:
Mã:
Sửa =fGpe(A1;"-") thành =fGpe(A1,"-")
File lưu dạng .xlsm là được
 

File đính kèm

Em cảm ơn nhiều ạ!
Anh cho e hỏi chút về cách chèn code vào google trang tính được không ạ?
Google sheets có thể chạy macro nhưng là ngôn ngữ google app scrit vì thế không thể áp dụng đoạn code trên cho google sheets bạn nhé
bạn chờ anh chị khác đi ngang rành về ngôn ngư này sẽ giúp bạn.
 
Google sheets có thể chạy macro nhưng là ngôn ngữ google app scrit vì thế không thể áp dụng đoạn code trên cho google sheets bạn nhé
bạn chờ anh chị khác đi ngang rành về ngôn ngư này sẽ giúp bạn.

Dạ vâng! Em cảm ơn ạ!
Bài đã được tự động gộp:

PHP:
Public Function fGpe(ByVal Txt As String, Byval Deli As String) As String
Dim j As Long, N As Long, Tmp
    Tmp = Split(Txt, Deli)
    N = Tmp(0)
    fGpe = N
If UBound(Tmp) > 0 Then
    For j = 1 To UBound(Tmp)
        N = N + Tmp(j)
        fGpe = fGpe & Deli & N
    Next j
End If
End Function
A1= '1-2-3-4-5-6-7-8-9
PHP:
B1= fGpe(A1;"-")

Em cảm ơn nhiều ạ!
Thầy cho e hỏi thêm chút nữa nữa là trên Google trang tính có add được code vào không ạ?
 
Dạ vâng! Em cảm ơn ạ!
Bài đã được tự động gộp:



Em cảm ơn nhiều ạ!
Thầy cho e hỏi thêm chút nữa nữa là trên Google trang tính có add được code vào không ạ?
Tôi chưa dùng Google trang tính gì đó lần nào, nhưng có lẽ không sử dụng VBA của Excel được.
Có thành viên @yeudoi ở Miền Trung chuyên về cái này.
 
Code cho Google Sheet:

/**
Hàm cộng các chữ số của 1 số
*/
function CongTongChuSo(input) {
var tong = 0, boDonVi= input;
while ((input = boDonVi) > 0) {
boDonVi= Math.floor(input/10);
tong += input - boDonVi*10;
}
return tong;
}

/**
Hàm cộng dồn từng đoạn của dãy số
*/
function CongDonDaySo(input) {
var a = input.split("-");
for (var i=1; i < a.length; i++) a = Number(a) + Number(a[i-1]);
return a.join("-");
}

Tôi chỉ code đến vậy thôi. Muốn hỏi gì thêm thì nhớ 2 điều:
1. tôi không nói chuyện nửa Tây nửa Việt
2. tôi không nói chuyện viết tắt. Điển hình, từ "e" đối với kiến thức Việt ngữ của tôi thì có nghĩa là "ngại"
 
Code cho Google Sheet:

/**
Hàm cộng các chữ số của 1 số
*/
function CongTongChuSo(input) {
var tong = 0, boDonVi= input;
while ((input = boDonVi) > 0) {
boDonVi= Math.floor(input/10);
tong += input - boDonVi*10;
}
return tong;
}

/**
Hàm cộng dồn từng đoạn của dãy số
*/
function CongDonDaySo(input) {
var a = input.split("-");
for (var i=1; i < a.length; i++) a = Number(a) + Number(a[i-1]);
return a.join("-");
}

Tôi chỉ code đến vậy thôi. Muốn hỏi gì thêm thì nhớ 2 điều:
1. tôi không nói chuyện nửa Tây nửa Việt
2. tôi không nói chuyện viết tắt. Điển hình, từ "e" đối với kiến thức Việt ngữ của tôi thì có nghĩa là "ngại"

Dạ vâng! Em cảm ơn nhiều ạ!
 
Code cho Google Sheet:

/**
Hàm cộng các chữ số của 1 số
*/
function CongTongChuSo(input) {
var tong = 0, boDonVi= input;
while ((input = boDonVi) > 0) {
boDonVi= Math.floor(input/10);
tong += input - boDonVi*10;
}
return tong;
}

/**
Hàm cộng dồn từng đoạn của dãy số
*/
function CongDonDaySo(input) {
var a = input.split("-");
for (var i=1; i < a.length; i++) a = Number(a) + Number(a[i-1]);
return a.join("-");
}

Tôi chỉ code đến vậy thôi. Muốn hỏi gì thêm thì nhớ 2 điều:
1. tôi không nói chuyện nửa Tây nửa Việt
2. tôi không nói chuyện viết tắt. Điển hình, từ "e" đối với kiến thức Việt ngữ của tôi thì có nghĩa là "ngại"

Phiền anh cho em hỏi thêm chút
Ví dụ:
Hàm cộng dồn từng đoạn của dãy số
*/
function CongDonDaySo(input) {
var a = input.split("-");
for (var i=1; i < a.length; i++) a = Number(a) + Number(a[i-1]);
return a.join("-");
}

Sau khi thêm vào phần "công cụ"--> "chỉnh sửa tập lệnh" rồi thì hàm viết trên ô của trang tính là gì để ra kết quả ạ?
Ví dụ: A1= 1-3-4-2-5 thì sau khi viết hàm vào ô cộng dồn sẽ ra kết quả là 1-4-8-10-15

Em cảm ơn nhiều!
 
...Sau khi thêm vào phần "công cụ"--> "chỉnh sửa tập lệnh" rồi thì hàm viết trên ô của trang tính là gì để ra kết quả ạ?
Ví dụ: A1= 1-3-4-2-5 thì sau khi viết hàm vào ô cộng dồn sẽ ra kết quả là 1-4-8-10-15
=CongDonDaySo(A1)
 
Ô A1 có cái gì đó mà hàm split trong code không hoạt động được.
Thử cái này trong B1:
=CongDonDaySo("5-1-2-6-8-1-1-1-3-1")
Kết quả:
5-6-8-14-22-23-24-25-28-29
 
Chịu thua. Tôi thử chả thấy vấn đề gì.
 
Bỏ javascript lâu quá rồi, nên chịu thua. Lười ;)
 
Dạ vâng! Em cảm ơn ạ!
Bài đã được tự động gộp:



Em cảm ơn nhiều ạ!
Thầy cho e hỏi thêm chút nữa nữa là trên Google trang tính có add được code vào không ạ?
Google sheets không sử dụng được VBA nha Bạn. Nếu bài bạn thì không cần Code vẫn có thể làm được. Bạn có thể vào Box Google spreadsheet để hỏi tiếp nha.
 
Google sheets không sử dụng được VBA nha Bạn. Nếu bài bạn thì không cần Code vẫn có thể làm được. Bạn có thể vào Box Google spreadsheet để hỏi tiếp nha.
Code kia là viết cho custom function của Google sheets.
Người hỏi hiển nhiên là có biết cách dùng code này. Chỉ là cái giao diện tiếng Việt cho nên tôi không rõ nó có vấn đề gì ở đây không.
 
Google sheets không sử dụng được VBA nha Bạn. Nếu bài bạn thì không cần Code vẫn có thể làm được. Bạn có thể vào Box Google spreadsheet để hỏi tiếp nha.

Dạ vâng! Em cảm ơn ạ!
Bài đã được tự động gộp:

Code kia là viết cho custom function của Google sheets.
Người hỏi hiển nhiên là có biết cách dùng code này. Chỉ là cái giao diện tiếng Việt cho nên tôi không rõ nó có vấn đề gì ở đây không.

Dạ vâng! Em cảm ơn ạ!
 
Google sheets không sử dụng được VBA nha Bạn.
Nhìn code thì đâu có là code VBA?

Bác VetMini đang nói tới cái khác. Trong trình của tôi thì menu nó là tiếng Ba Lan nên tôi thử dịch. Mở tập tin -> menu Tools -> chọn Editor Script -> dán code.

@tuantran10391: bạn sửa

a = Number(a) + Number(a[i-1]);

thành
Mã:
a[i] = Number(a[i]) + Number(a[i-1]);
Tức phải có
Mã:
function CongDonDaySo(input) {
var a = input.split("-");
for (var i=1; i < a.length; i++) a[i] = Number(a[i]) + Number(a[i-1]);
return a.join("-");
}
 
Nhìn code thì đâu có là code VBA?

Bác VetMini đang nói tới cái khác. Trong trình của tôi thì menu nó là tiếng Ba Lan nên tôi thử dịch. Mở tập tin -> menu Tools -> chọn Editor Script -> dán code.

@tuantran10391: bạn sửa

a = Number(a) + Number(a[i-1]);

thành
Mã:
a[i] = Number(a[i]) + Number(a[i-1]);
Tức phải có
Mã:
function CongDonDaySo(input) {
var a = input.split("-");
for (var i=1; i < a.length; i++) a[i] = Number(a[i]) + Number(a[i-1]);
return a.join("-");
}

Hay quá ạ! Em làm được rồi anh nhé!
Em cảm ơn nhiều ạ!
 
... bạn sửa
a = Number(a) + Number(a[i-1]);
thành
a = Number(a) + Number(a[i-1]);
Cảm ơn bác đã chỉ ra cái lỗi căn bản đó.
Tôi có lẽ cóp code vào lúc buồn ngủ quá nên cóp nhằm cái phiên bản lúc chưa sửa xong. Mạng hơi chậm cho nên cái vụ phiên bản "draft" trên GAS nó hơi lạng quạng.

Thiệt ra cái phiên bản mới nhất nó như vầy:
var a = input.split("-").map(function (el) { return Number(el) });
for (var i=1; i < a.length; i++) a += a[i-1];
return a.join("-");
 

Bài viết mới nhất

Back
Top Bottom