Trong bài viết này, chúng tôi đã giải thích thuật toán cộng các chữ số của một số N và trình bày phân tích độ phức tạp thời gian và không gian. Chúng tôi cũng đã trình bày việc triển khai bằng Ngôn ngữ lập trình C
Mục lục
- Thuật toán cộng các chữ số của một số
- Mẫu
- Thời gian phức tạp
- Độ phức tạp không gian
Thuật toán cộng các chữ số của một số
Thuật toán cộng các chữ số của một số như sau
- Khởi tạo tổng là 0
- Cho một số N
- Trích xuất chữ số cuối cùng là N % 10 [mô-đun]
- Thêm chữ số cuối cùng vào một biến tổng
- Cập nhật N bằng cách bỏ chữ số tận cùng là N/10 [phép chia]
- Lặp lại các bước trên cho đến khi N lớn hơn 0
Ý tưởng cốt lõi là chúng tôi trích xuất chữ số cuối cùng ở mỗi giai đoạn và thêm nó vào một biến chung được khởi tạo bằng 0 ngay từ đầu. Điều này dẫn đến tổng tất cả các chữ số của một số
Sau đây là mã giả
sum = 0
Let input be N
// Make N positive if it is negative
If N < 0
N = -1 * N
// Loop through all digits and get sum
while N > 0
sum = sum + N%10
N = N / 10
answer = sum
Mẫu
Nếu một số N có M chữ số thì giá trị lớn nhất của câu trả lời sẽ là
9*M
Vậy nếu có 5 chữ số thì tổng lớn nhất sẽ là 9 x 5 = 45
Tổng sẽ tăng và giảm trên tất cả các số có 5 chữ số
Nếu số có dạng 8****
, thì tổng lớn nhất sẽ là 44 và nhỏ nhất sẽ là 8. Nếu bạn bắt đầu từ 8000, tổng sẽ bắt đầu từ 8 và tăng dần, tăng dần cho đến 17 là 8009. Nó sẽ lại giảm mạnh xuống 9 vào lúc 8010
Nếu bạn mã hóa cứng mẫu này trong chương trình của mình, bạn có thể giải quyết vấn đề này hiệu quả hơn nhiều với chi phí yêu cầu không gian cao hơn
Thời gian phức tạp
Trong một số N đã cho, có các bit log[N]
Nếu số N ở trong cơ sở B [thường là B=10], thì số chữ số trong N là log10N. Vì chúng ta đang lặp qua tất cả các chữ số của số N để tìm tổng, nên độ phức tạp về thời gian sẽ là O[logN]
Trường hợp xấu nhất, trung bình và tốt nhất là giống nhau đối với vấn đề này khi chúng tôi lặp qua số chữ số cố định
- Độ phức tạp thời gian trường hợp tốt nhất. O[logN]
- Độ phức tạp thời gian trường hợp trung bình. O[logN]
- Trường hợp xấu nhất thời gian phức tạp. O[logN]
Độ phức tạp không gian
Độ phức tạp không gian của phương pháp này là O[1] vì không cần bộ nhớ có kích thước thay đổi bổ sung
Chúng ta chỉ cần ba biến để lấy tổng và trích xuất từng chữ số của số ban đầu
Thực hiện trong C
Sau đây là cách thực hiện trong Ngôn ngữ lập trình C để tìm tổng tất cả các chữ số của một số N
// Part of iq.opengenus.org
#include
int main[] {
int N = 9453;
int sum = 0;
// Convert number to positive
// if negative
if[N < 0]
N = -1 * N;
// Loop through all digits
while[N > 0]
{
sum = sum + N%10;
N = [int]N/10;
}
printf["%d", sum];
return 0;
}
đầu ra
21
Ví dụ từng bước
Trạng thái ban đầu
N = 9453
tổng = 0Bước 1. Trích xuất chữ số đầu tiên
tổng = 0 + 3
N = 945Bước 2. Trích xuất chữ số thứ hai
tổng = 3 + 5
N = 94Bước 3. Trích xuất chữ số thứ ba
tổng = 8 + 4
N = 9Bước 4. Trích xuất chữ số thứ tư
tổng = 12 + 9
N = 0Câu trả lời
tổng = 21
Trả lời là giá trị của tổng là 21
Với bài viết này tại OpenGenus, bạn phải có ý tưởng đầy đủ về cách tìm tổng tất cả các chữ số của một số
Chúng ta có thể duyệt qua các danh sách bên trong danh sách và tính tổng tất cả các phần tử trong một danh sách đã cho và bằng hàm max lấy tổng tối đa của tất cả các phần tử trong danh sách của danh sách.
con trăn
# Python program to find the
# list in a list of lists whose
# sum of elements is the highest
330
331
332
333_______3_______4_______3_______5
336
333_______3_______8
333_______3_______0
331
332
333
334_______3_______5
335
336
334_______3_______9
334_______3_______0
sum[max[list1, key=sum]]2
332
sum[max[list1, key=sum]]4
sum[max[list1, key=sum]]5
335
sum[max[list1, key=sum]]7
335
sum[max[list1, key=sum]]9
334_______3_______4_______3_______5
333
334
335
336
334
333_______3_______9
334
333
332
333
335
335
336
337
338
337
330
331
332
337
334
337
336
331
338
337
# Python program to find the
0337
# Python program to find the
2331
# Python program to find the
4337
# Python program to find the
6337
# Python program to find the
8# Python program to find the
9# list in a list of lists whose
0 # list in a list of lists whose
1
Đầu ra
33
Thời gian phức tạp. O[n*m] trong đó n là số lượng danh sách và m là kích thước tối đa của danh sách
Không gian phụ trợ. Ô[1]
Phương pháp 2. Tra cứu danh sách
Chỉ duyệt qua danh sách bên ngoài và tính tổng tất cả các phần tử trong danh sách bên trong bằng cách sử dụng hàm sum[], tìm tổng của tất cả các danh sách và lấy giá trị lớn nhất của tất cả các tổng được tính.
con trăn
# Python program to find the
# list in a list of lists whose
# sum of elements is the highest
# list in a list of lists whose
5
331
332
333_______3_______4_______3_______5
336
333_______255_______3
333_______3_______0
331
332
333
334_______3_______4_______3_______5
333_______3_______4
335
3305
334
333_______3_______9
334
333
332
333
335
335
336
337
338
337
330
331
332
337
334
337
336
331
338
337
# Python program to find the
0337
# Python program to find the
2331
# Python program to find the
4337
# Python program to find the
6337
# Python program to find the
8# Python program to find the
9# list in a list of lists whose
0 # list in a list of lists whose
1
Đầu ra
33
Thời gian phức tạp. O[n*m] trong đó n là số lượng danh sách và m là kích thước tối đa của danh sách
Không gian phụ trợ. Ô[1]
Phương pháp 3. Hàm tổng và hàm Max
sum[max[list1, key=sum]]
Cú pháp trên của hàm max[] cho phép chúng ta tìm tổng của danh sách trong danh sách bằng cách sử dụng key=sum. max[list1, key=sum], cái này tìm danh sách có tổng các phần tử lớn nhất và sau đó sum[max[list1, key=sum]] trả về cho chúng ta tổng của danh sách đó.
con trăn
# Python program to find the
# list in a list of lists whose
# sum of elements is the highest
3344
331
332
333_______3_______9
334_______3_______5_______3_______4
333
3353
335
335
3356
333
332
333
335
335
336
337
338
337
330
331
332
337
334
337
336
331
338
337
# Python program to find the
0337
# Python program to find the
2331
# Python program to find the
4337
# Python program to find the
6337
# Python program to find the
8# Python program to find the
9# list in a list of lists whose
0 # list in a list of lists whose
1
Đầu ra
33
Thời gian phức tạp. O[n*m] trong đó n là số lượng danh sách và m là kích thước tối đa của danh sách
Không gian phụ trợ. Ô[1]
Phương pháp 4. Sử dụng các phương thức sum[] và sort[]
Python3
# Python program to find the
# list in a list of lists whose
# sum of elements is the highest
330
331
332
333_______3_______1_______3_______5
3397
333_______3_______0
3300
332
333
334_______3_______04
335
3306
333______3_______08
333_______3_______9
3311_______3_______12
336
3314
334
333
3317
333
335
335
336
337
338
337
330
331
332
337
334
337
336
331
338
337
# Python program to find the
0337
# Python program to find the
2331
# Python program to find the
4337
# Python program to find the
6337
# Python program to find the
8# Python program to find the
9# list in a list of lists whose
0
3346
Đầu ra
33
Thời gian phức tạp. O[NlogN]
Không gian phụ trợ. TRÊN]
Phương pháp 5. Sử dụng giảm[]
Phương pháp này sử dụng hàm reduce[] để lặp qua danh sách các danh sách và hàm lambda để so sánh tổng của từng danh sách. Hàm lambda trả về danh sách có tổng lớn hơn và hàm rút gọn theo dõi tổng tối đa bằng cách áp dụng lặp lại hàm lambda cho danh sách các danh sách. Kết quả cuối cùng là tổng của danh sách với tổng lớn nhất
Đây là một cách tiếp cận khác sử dụng hàm reduce[] và hàm lambda
Python3
3347
3348
3349
3350
331
3352
333_______3_______54
333_______3_______56
333_______3_______58
335
3350_______3_______4
3362
3363
3364
335
3366
335
3368
3369
3370
333_______3_______9
335
3374
3375
335
335
336
337
338
337
330
331
332
337
334
337
336
331
338
337
# Python program to find the
0337
# Python program to find the
2331
# Python program to find the
4337
# Python program to find the
6337
# Python program to find the
8# Python program to find the
9