01/10/2018, 09:43
Nhờ mọi người cho mình hướng đi của bài tập sau!
Xin chào mn, mình đc thầy giao 1 bài tập như sau:
Cho 1 số nguyên dương được nhập từ bàn phím, hãy sắp xếp các chữ số của số đó theo thứ tự tăng dần tạo thành 1 số mới. In số mới ra màn hình. (Chỉ sử dụng kiến thức câu điều kiện & rẽ nhánh, vòng lặp, hàm, không đc sử dụng mảng)
Bài này thầy nói làm bằng C.
Mn có thể cho mình xin hướng làm đc ko ạ (tối ưu hoặc ko tối ưu). Sau đó mình tự code cũng đc vì mình biết nếu xin code là vi phạm nội quy
Mình xin cảm ơn trc !
Bài liên quan
Hi Nguyễn Thanh Việt
Có vấn đề gì nhỉ ? Bóc mảng chứ số ra. Xắp xếp. In ra.
Mình chưa hiểu lắm, bạn có thể nói hơn đc ko? (mình chưa học mảng nên ko thể áp dụng đc, vả lại thầy cũng yêu cầu làm bằng hàm, thủ tục thôi ạ!)
không được sử dụng mảng thì bạn có thể tách các số riêng ra hàng chục , hàng trăm, đơn vị, nghìn…, rồi lưu lại vào biến , sau đó sắp xếp , rồi gán lại ,
vd 4352 chia 10 dư (2) thương là 435 chia tiếp cho 10 dư (5) --> ra các chữ số nhá
nhét các chữ số này vào mảng.
Trường hợp số có quá nhiều chữ số thì mình nghĩ dùng biến ko khả thi đâu bạn
@Dao_An Ko đc dùng mảng bạn ơi !!!
nếu đã không được dùng mảng, không biết bạn có được dùng danh sách liên kết không :))
vì không sử dụng được mảng nên chỉ mình nghĩ sử dụng biến , nhưng không phải tất cả các biến , mà tách tới đâu so sánh tới đó , và lần tới chỉ cần so sánh với các giá trị từ nhỏ đến lớn , hạn chế được số biến
Hi Nguyễn Thanh Việt.
Bạn có thể coi số đó là 1 mảng luôn rồi chiển khai xắp xếp trên đó.
Dùng số dương đấy chia cho 10 tới số cuối cùng sau đấy thực hiện so sánh rồi sắp xếp…!
Mình nghĩ thuật toán là thế.
Hình như Linked List có liên quan tới struct và pointer dug ko a? E chưa học nên chắc ko đc
Bạn nói rõ hơn đc ko? Mình cũng hiểu sơ sơ ý bạn những chưa hình dung đc lắm
Bằng cách nào a?
Vậy mỗi chữ số khi % cho 10 lưu ở đâu?
Hi Nguyễn Thanh Việt.
Bạn muốn đổi chỗ hai chữ số a vị trí indexOfA và b indexOfB của só n
Công việc là tìm a, b, indexOfA, indexOfB.
Bạn đã có hàm swap hai số bây giờ công việc còn lại của bạn là áp dụng thuật toán xắp xếp trên đó.
thì bạn so sánh cái bạn xóa luôn biến đó đi , thì sẽ hạn chế tối đa , với cả trăm biến là bình thường , nên vấn đề về số lượng biến không phải là lớn:3
Ban đầu bạn cứ làm mảng đi, rồi sau đó chỉnh code lại là thành bài tập không sử dụng mảng.
Mình giả sử biến lưu trữ nhận từ input là
input
và có kiểuInt
result = array[index]
thì có hàmresult = getNumber(input, index)
trả về chữ số ở vị trí index.array[index] = value
thì thànhsetNumber(input, value, index)
thay chữ số vị trí thứ index của input thành value.Hiện thực thêm 3 hàm
count
,prepend
vàappend
đếm số phần tử trong mảng, chèn 1 số vào trước hoặc sau mảng, ví dụ:input = 243112
cout << cout(input) // giá trị là 6
input = 12
prepend(input, 2)
cout << input; // có giá trị 212
input = 21
append(input, 4)
cout << input // có giá trị 214
Rồi trong bài giải mảng ban đầu bạn thay thế các câu lệnh mảng thành các hàm bạn đã tạo. Hoàn thành bài tập mà không dùng mảng.
Chắc không cần mảng bạn ah, mình viết thử như sau:
Hoàn toàn không cần mảng, nhưng rất tốn biến :v
Rõ ràng là ta thấy các chữ số chỉ từ 0…9. Lập 10 biến
cnt0, cnt1,..., cnt9
là số lần xuất hiện của các chữ số0, 1,..., 9
.Duyệt các chữ số trong số
n
:Cuối cùng thì:
À mà bạn tự cải tiến vụ có chữ số 0 ở đầu nhé.
HI Mato Nguyen
Không up code.
Mình làm theo cách bạn này cũng khá ok nè, nhưng khúc cuối mình lưu nó vào 1 biến kết quả và return về chứ ko in ra
Mình chưa học tới bài mảng sao dùng đc @@ Vả lại còn chưa học C++
Mình ko ngại khi số lượng biến cần dùng là nhiều, mình chỉ ngại vì bài này mà dùng biến thì các biến sẽ khai báo với số lượng “bị động”, tức là ko biết trc bao nhiêu để khai báo, nên mình nghỉ ko khả thi
@Phong_Ky_Vo Để e suy nghĩ theo cách anh thử, nhưng việc tìm indexofA và indexofB hơi khó đấy !
Cái đoạn cộng số ấy, sao bạn không dùng
n = n * 10 + i
để chắc chắn không bị sai số? Động đến float là cực kì nguy hiểm. Tốt nhất là không dùng trong trường hợp không cần thiết.Bài này cũng không cần thiết phải dùng đến ceil, pow, floor,… các kiểu. Cứ dùng
là chắc chắn đúng, có sai là do mình code thôi :v
Vấn đề cuối cùng của bạn là ra một số mà các chữ số trong con số đó được sắp xếp tăng dần. ( 5231 ) -> ( 1235 )
Nếu như vầy, thì bạn dùng phép tách số bằng việc chia cho 10 lấy dư.
Nói cho dễ hiểu là vầy
N = 5231
Chia lấy dư lần 1 => số dư là 1 , số sau khi tách số là 523
Số cuối cùng lần 1 = 1
Chia lấy dư lần 2 => số dư là 3 , số sau khi tách số là 52
Số cuối cùng lần 1 = 1*10 + 3 = 13
Tương tự cho lần sau.
Trông hơi hư cấu nhỉ :v nhưng sao chia lấy dư lần 2 là 3, mà số cuối cùng là 12?