Ghép các số cho trước để được số lớn nhất

em/mình có bài tập như này:

Cho một dãy gồm n số nguyên không âm, bạn hãy viết chương trình sắp xếp dãy số này sao cho khi nối các số lại với nhau thì ta thu được một số nguyên có giá trị lớn nhất.

ps: Em/mình đã làm được nhưng phải dùng đến hàm sort.
Mọi người cho một ý tưởng “sơ cấp” đi ạ. Bài tập trong phần thuật toán nên em/mình muốn có một cách tư duy khác

Vui lòng thêm categories vào nhé :smiley:

2 Likes

dạ vâng, lần sau e nhớ.

Sắp xếp từ lớn đến bé

mình chưa hiểu ý tưởng của bạn

Sắp xếp các số vừa nhập
vd: 1,3,2 thành 3,2,1 thì nối 3 số đó vào sẽ ra số nguyên lớn nhất

1 Like

Cẩn thận ghép một số trường hợp, như 220.

20 > 2 nhưng ghép 2|20 lợi hơn 20|2.

Không phải cứ sắp xếp giá trị số thông thường là xong. Bạn nhìn trường hợp mình chỉ ra rồi suy nghĩ thêm nhé.

2 Likes

bạn hiểu sai đề rồi, là số chứ không phải chữ số

1 Like

bước đầu các số vừa nhập sẽ chuyến sang string
rồi tách các chữ số ra từ string đó
sắp xếp bình thường

Ai cho tách mà tách.

1 Like

Sắp xếp các số theo độ lớn của chữ số đầu tiên. Nếu chữ số cao nhất nhỏ hơn thì so đến chữ số cao thứ 2… Nếu một số mà bắt đầu bằng một số khác thì so sánh chữ số đầu tiên của số bên trong với chữ số đầu tiên của phần thừa ở số bên ngoài, nếu chữ số đầu tiên ấy cũng bằng thì so tiếp chữ số thứ 2 với chữ số thứ 2 của phần thừa…
Ví dụ 2, 6, 12, 32, 26, 25, 254, 555, 257, 251 ta sẽ sắp xếp:
6, 555, 32, 26, 257, 254, 25, 251, 2, 12. Số thu được là 6555322625725425251212

3 Likes

nếu biết cách xếp 2 số thì có xếp được một dãy không a. e thấy xếp dãy nó phức tạp hơn nhiều quá

Được. Cơ bản vẫn là tiêu chí nào để quyết định số nào đứng trước số nào thôi. Tất cả nằm trong điều kiện if.

1 Like

em cũng nghĩ đến ý tưởng này rồi, nhưng code thì không code được ;(

Tách thành các chuỗi rồi so sánh ký tự tương ứng vị trí thôi bạn :smile:

Mô tả vậy khó lắm :smiley: ghép thử như @noname00 là đúng rồi.

2 Likes
#include <iostream>
#include <algorithm>
#include <string>
#define SIZE 5
using namespace std;

int main() {
	// Test case
	int A[SIZE] = {1, 20, 3, 4, 22};
	// Chuyển Test case từ int[] -> string[]
	string T[SIZE];
	for(int i = 0; i < SIZE; ++i) T[i] = to_string(A[i]);
	// Sắp xếp mảng T thep thứ tự từ điển
	// Sử dụng giải thuật sắp xếp nổi bột
	for(int i = 0; i < SIZE; ++i)
	for(int j = SIZE - 1; j > i; --j)
	if(T[j].compare(T[j - 1]) == 1) {
		swap(T[j], T[j - 1]);
	}
	// In kết quả
	for(int i = 0; i < SIZE; ++i) cout << T[i];
}
a = [1, 20, 2, 3, 30]
a.sort! do |x, y|
  x = x.to_s
  y = y.to_s
  if x.length < y.length
    x = x + y[0...(y.length - x.length)]
  elsif y.length < x.length
    y = y + x[0...(x.length - y.length)]
  end
  y <=> x
end
p a # => [3, 30, 2, 20, 1]

mình code ruby, không biết thế này có đúng k nữa :smile:
đại loại thì thuật toán của mình là dùng hàm sort với hàm so sánh custom lại, khi so sánh 2 số thì mình sẽ xét xem số nào đứng trước sẽ được số lớn hơn bằng cách chuyển 2 số thành chuỗi rồi lấy phần đầu của chuỗi dài hơn nối vào phần đuôi của chuỗi ngắn hơn sao cho độ dài 2 chuỗi bằng nhau, sau đó so sánh 2 chuỗi đó.

1 Like

bài này quen quen hình như có ai hỏi rồi :joy: Cách giải đơn giản ko ngờ

std::sort(begin(arr), end(arr), [](int a, int b) {
    auto aa = std::to_string(a);
    auto bb = std::to_string(b);
    return aa + bb > bb + aa;
});

edit cái dấu > mới đúng

4 Likes

Nên đổi hết ra string rồi mới dồn vào mảng :smiley:

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?