01/10/2018, 17:33
Sắp xếp dãy số để nối lại thành số nguyên lớn nhất
em có 1 bài như sau, mà nói chung là như ảnh, không biết em có hiểu sai đề không mà nó cứ bị sai test, ai giúp em với, đã 3 ngày rồi

còn đây là code em http://codepad.org/BGJXtpGD
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
int main()
{
int size, num;
vector<int> arr;
vector<int> digit;
int temp = 0, count = 0;
cin >> size;
while (temp < size)
{
cin >> num;
arr.push_back(num);
temp++;
}
for (int i = 0; i < arr.size(); i++)
{
if (arr[i] > 9)
{
while (arr[i] > 0)
{
digit.push_back(arr[i]%10);
arr[i] = arr[i] / 10;
count++;
}
}
else {
digit.push_back(arr[i]);
count++;
}
}
sort(digit.begin(),digit.end(),greater<int>());
double final=0;
int numb=digit.size();
for(int i=0;i<digit.size();i++)
{
final+=(digit[i]*pow(10,numb-1));
numb--;
}
cout<<final;
}
cảm ơn mọi người ạ
Bài liên quan
em sửa code them setprecision để nó ra số lớn, mà cũng không đúng
em cho ra số ra 1 array rồi sort lại, sau đó in ra, nhưng không hiểu sao lại sai @@
Nhìn chỗ comparator là biết sai oài bạn viết comparator rồi thảy vào, xài default ko ra đúng đâu.
Đọc gợi ý là hiểu thôi mà. Xử lý ở dạng chuỗi (string)
viết lại comparator cho string theo gợi ý của đề bài:
em thắc mắc là đề này 45 7 thì kq sẽ là 745 hay sẽ là 754 ạ?
“745” = “7” + “45”
mọi người ơi, em viết lại code theo hướng dẫn mà vẫn sai ,mọi người giúp em với
code em http://codepad.org/ILQ4PY14
Để ý rằng số nguyên tới 10^9 => ghép lại phải 64 bit mới tính đúng. Đoạn ghép số thì mình sẽ viết bằng C nó chạy rất nhiều lần muh.
Là sao ạ? E đang học cấu trúc dữ liệu giải thuật bằng c++ . E chưa hiểu cái 64bit a nói lắm nó nghĩa là sao ạ.
mình nghĩ bài này bạn nên viết thêm hai hàm, 1 hàm chuyển tham số kiểu int truyền vào thành kiểu String trả về, một hàm thì làm ngc lại.
String IntToString(int n);
int StringToInt (String str);
vd: n = 123; chuyển thành String str = “123”;
Còn lại là bạn so sánh các String rồi xuất ra màn hình theo thứ tự là được. Nếu đề yêu cầu xuất ra số thì bạn gọp các String lại, rồi chuyển sang int là được.
Em làm như thế ở code dưới a. Nhưng không đc
Code của bạn sai logic rồi, chỗ hàm check bạn so sánh 2 số, xong rồi bạn coi thằng nào lớn hơn rồi bạn ghép nó lại, như vậy đâu có được.
Bạn phải so sánh toàn bộ rồi tìm thằng lớn nhất ghép vs thằng lớn thứ nhì chứ.
vd như trong code của bạn a=4, b=56 lỡ nó còn thằng c=50 nữa thì sao. Bạn check 2 thằng a vs b, rồi bạn ghép nó thành 564, lúc này bạn check tiếp c là sai rồi.
Đừng tách thành các số/chữ số, hãy áp thẳng function so sánh với string như
@Gio
đã comment ở trên.Đâu có .em có gắn vào vòng for đó a. Nó sẽ xét hết dãy chứ. A cứ thử chạy đi là biết
Mình ko có chuyên về C++, vs lại bây h sao mà mình test được.
Mình làm theo ý mình nhé.
2^32 hơn 4*10^9 một chút. Vậy không quá 10^9 tức là 30 bit. Chập hai số lại với nhau là 62 bit (chập lại chứ không phải nhân với nhau) , vậy dùng toàn số thì phải
uint64_t
.Code này viết theo thuật toán đề cho trước, nên rất có thể là comparator sai.
Tóm tắt (khá dễ nhưng hơi cực).
Với <= là thứ tự từ điển, đặt
aRb := a + b < b + a
với + là phép nối chuỗiaQb := a[1..min(|a|, |b|)] <= b[1..min(|a|, |b|)]
với |s| là độ dài của chuỗi s,ta sẽ c/m R có tính chất thứ tự. Dễ thấy Q có tính bắc cầu.
Do
|a + b| = |b + a|
nên(a + b)Q(b + a)
. Lại có(a + a)Q(a + b)
và(b + a)Q(b + b)
nên(a + a)Q(b + b)
. Tương tự, nếubRc
thì(a + a)Q(c + c)
. Giờ ta phải tìm cách suy ngược về aRc. Chia ra 4 trường hợp ta suy ra đpcm. Vậy sắp xếp theo R là đúng.Ghi chú
Nếu để <= luôn thì sẽ sai (vd. a = “11”, b = “1”).
Với lại còn thiếu cái dãy đó là max luôn, swap thì chắc chắn là không được (“47” vs “4”: “4794” vs. “4947”).
Đây là số a ơi test đầu là 20 9 3 2 sẽ ra 93220 nhưng không phải ghép lại hay đổi vị trí lớn nhất
Mình xem nó là chuỗi cho tổng quát đề cho toàn là số thì sẽ không có chuỗi bựa như “0000…06”, và dù gì thì chuỗi dạng này cũng cực nhỏ (zero đầu).
p/s: có lẽ nên chuyển hướng qua a + a < b + b.
Hic em đã thử rất nhiều test nhueng vẫn sai. Không hiểu đề kiểu gì nữa