запрос на член 'append' в 'a', который имеет тип не int класса 'int' - PullRequest
0 голосов
/ 18 октября 2019

Я новичок в программировании, так что мои сомнения, возможно, довольно глупыпоэтому, когда я пытаюсь решить задачу, в которой я должен сформировать наибольшее число из цифр в массиве. поэтому я создал функцию сравнения и перешел к функции сортировки. в функции сравнения я проверяю, больше ли a + b, чем b + a, и наоборот. но компилятор показывает сообщение об ошибке с запросом для члена, не являющегося типом класса.

На самом деле я не имею ни малейшего представления о том, как решить эту проблему, я пробовал гуглить, но не нашел своего решения. Я нашел подобное решение, но они делают это со строкой. может ли это быть сделано с массивом.

int myCompare( int a, int b){


    int ab= a.append(b);
    int ba= b.append(a);

    if(ab>ba){
        return 1;
    }else{
        return 0;
    }

}

void biggestnum(int arr[], int n){

    if(n==0 || n==1){
        return;
    }

    sort(arr,arr+n, myCompare);

    for(int i=0;i<n;i++){
        cout<<arr[i]<<" ";
    }
    cout<<endl;
}

, поэтому, если данный массив равен {54, 546, 548, 60};результат должен быть 6054854654.

1 Ответ

1 голос
/ 18 октября 2019

Скалярный фундаментальный тип int не имеет методов. Таким образом, эти записи

a.append(b);
b.append(a);

являются недействительными.

Кажется, что при использовании такой конструкции, как эта

a.append(b)

вы пытаетесь преобразовать целое число в объекткласс std::string. Однако, если a и b были объектами типа std::string, нет смысла добавлять один объект к другому. Достаточно сравнить исходные строки.

Кажется, что вы пытаетесь достичь следующего:

#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>

bool myCompare( unsigned int a, unsigned int b )
{
    std::string s1 = std::to_string( a );
    std::string s2 = std::to_string( b );

    auto n = std::minmax( { s1.size(), s2.size() } );

    int result = s1.compare( 0, n.first, s2, 0, n.first );

    return ( result > 0 ) || 
           ( result == 0 && 
           ( ( s1.size() < n.second && s2[n.first] < s1[0] ) || 
             ( s2.size() < n.second && s2[0] < s1[n.first] ) ) );
}    

int main() 
{
    unsigned int a[] = { 54, 546, 548, 60 };

    std::sort( std::begin( a ), std::end( a ), myCompare );

    std::string s;

    for ( const auto &item : a )
    {
        s += std::to_string( item );
    }

    unsigned long long int value = std::stoull( s );

    std::cout << "The maximum number is " << value << '\n';

    return 0;
}

Вывод программы:

The maximum number is 6054854654

, еслиномер результата может быть слишком большим, чтобы поместиться в объект типа unsigned long long int, тогда вы можете удалить оператор

    unsigned long long int value = std::stoull( s );

и просто вывести строку результата как

    std::cout << "The maximum number is " << s << '\n';
...