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

ờ nhỉ, chỉ cần thế này thôi, đâu cần thiết phải

ahihi

1 Like

hồi trước giải bài này mình cũng suy nghĩ như vậy, cần làm cho 2 chuỗi dài bằng nhau :joy: code còn kinh dị mỹ hơn nữa :joy:

1 Like

không dùng đến hàm sort cơ anh, e làm cách tương tự thế rồi

bạn hãy viết chương trình sắp xếp dãy số

là sao đây :V

1 Like

chắc ý bạn ấy là không dùng hàm sort với custom compare, mà tự viết theo thuật toán sắp xếp gì đó như chèn, nổi bọt… :smile:

1 Like

vậy cũng khác gì dùng hàm sort đâu ?.?

hỏi nấu cơm ko cho xài nồi cơm điện thì bó tay mình có biết đốn củi đâu :joy:

1 Like

ý e là không dùng sort luôn kiểu sort (arr.begin(), arr.end(), comp). E không nhìn ra cách nó hoạt động, e muốn code lại cái hàm đấy.

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
bool Whichputfirst(string a, string b)
{
    string ab=a.append(b);
    string ba=b.append(a);
    if(ab.compare(ba)>0) return true;
    return false;
}
main()
{
    int n; cin >> n; string a[n];
    for(int i=0; i<n; i++) cin >> a[i];
    sort(a, a+n, Whichputfirst);
    for(int i=0; i<n; i++) cout << a[i];
    return 0;
}
// đây là code e đã viết
1 Like

vậy em viết code sắp xếp chuỗi theo alphabet đi :V

chỗ nào có so sánh a[i] < a[j] thì sửa lại thành Whichputfirst(a[i], a[j]) là xong…

1 Like

ví dụ với 3 số 85 997 88 thì nó xét như nào a.
em cứ thấy nếu nó ghép 997 với 85 trước thì lại không đúng

Toạch :smiley: a = “42”, b = “42424”
b + a = “4242442”
a + b = “4242424”

mất cả buổi sáng.

1 Like

trong cái comparator a + b > b + a mới đúng :V mới sửa :V sắp xếp ngược mới đẩy số lớn hơn lên trước.

à cái vụ căng độ dài a = độ dài b này lỗi tùm lum, code kinh dị luôn mà =]

1 Like

đầu tiên nó so sánh 85 với 997, “85997” > “99785” sai, nên nó đổi vị trí 2 số này để cho 997 đứng trước: 997 85 88
sau đó nó so sánh 997 với 88: “99788” > “88997” đúng nên nó giữ nguyên vị trí 2 số: 997 85 88
997 là lớn nhất, so sánh tiếp 2 số còn lại là 85 và 88. “8588” > “8885” sai nên nó đổi vị trí 2 số này: 997 88 85

hết cái để so sánh :V

2 Likes

a + b > b + a này nó có tính bắc cầu thật :smiley: suy ra được a + a ~ b + b là xong.

2 Likes
package javaapplication2;

import java.util.Scanner;

public class JavaApplication2 {

    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n;
        System.out.print("moi nhap n: ");
        n=sc.nextInt();
        int[] ar=new int[n];
        for(int i=0;i<n;i++){
            System.out.print("moi nhap ar["+i+"]: ");
            ar[i]=sc.nextInt();
        }
        for(int i=0;i<n;i++){
            for(int j=0;j<n-1;j++){
                int Fdigit1=GetFirstDigit(ar[j]);              
                int Fdigit2=GetFirstDigit(ar[j+1]);
                if(Fdigit1<Fdigit2){
                    int x=ar[j];
                    ar[j]=ar[j+1];
                    ar[j+1]=x;
                }

            }
        }
        for(int u=1;u<10;u++){
            for(int i=0;i<n;i++){
            for(int j=0;j<n-1;j++){
                int Fdigit1=GetFirstDigit(ar[j]);              
                int Fdigit2=GetFirstDigit(ar[j+1]);
                 if(u==Fdigit1 && u==Fdigit2){
                     String s1=ar[j]+"";
                     String s2=ar[j+1]+"";
                     if(Integer.parseInt(s1+s2)<Integer.parseInt(s2+s1)){
                         int x=ar[j];
                         ar[j]=ar[j+1];
                         ar[j+1]=x;
                     }
                }
            }
        }
        }
         System.out.println("cac so sap xep thanh so nguyen lon nhat la: ");
        for(int i=0;i<n;i++){
            System.out.print(ar[i]+" ");
        }
        //2, 6, 12, 32, 26, 25, 254, 555, 257, 251
}
    static int GetFirstDigit(int number){
        String numberString = "" + number;
        char firstLetterchar = numberString.charAt(0);
        int firstDigit = Integer.parseInt("" + firstLetterchar);
        return firstDigit;
    }
}
Output:


moi nhap n: 10
moi nhap ar[0]: 2
moi nhap ar[1]: 6
moi nhap ar[2]: 12
moi nhap ar[3]: 32
moi nhap ar[4]: 26
moi nhap ar[5]: 25
moi nhap ar[6]: 254
moi nhap ar[7]: 555
moi nhap ar[8]: 257
moi nhap ar[9]: 251
cac so sap xep thanh so nguyen lon nhat la:
6 555 32 26 257 254 25 251 2 12 BUILD SUCCESSFUL (total time: 25 seconds)

Kết quả cùa bạn sẽ sai nếu mảng có các số: 2, 6, 12, 32, 26, 25, 254, 555, 257, 251

1 Like

ò, vậy chắc phải + full chứ không phải độ dài bằng nhau :smiley:

Ban đầu mình nghĩ bạn đúng, nhưng thử làm một trường hợp đơn giản thì thấy nó tréo ngoe => phản thí dụ :smiley:

Tức là ntn, giả sử |b| > |a|, ta setup sao cho |b| kí tự đầu của a+b và b+a bằng nhau và giải hệ.

1 Like

chài ai, nghe giống Toán quá vại, mình dốt Toán TT_TT

Nếu chỉ để soi từng cặp kí tự thì không cần tính a+b hay b+a :smiley: max speed.

chẳng qua là chưa có cách học :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?