我试图从一组整数中组合出可能的最大数.该代码只有在输入为个位数时才有效,否则它会给我错误的答案.例如,如果输入是2,21,它会给我212而不是221.我试图编辑代码,但我卡住了.我有一个 idea ,将用户输入的任何数字转换为数字,即210->2,1,0.但我不知道如何实现它.

int IsGreaterOrEqual(int n1, int n2)
{
    
}

void swap(int* xp, int* yp)
{
    int temp = *xp;
    *xp = *yp;
    *yp = temp;
}

void selectionSort(int arr[], int n)
{
    int i, j, min_idx;

    // One by one move boundary of unsorted subarray
    for (i = 0; i < n - 1; i++) {

        // Find the minimum element in unsorted array
        min_idx = i;
        for (j = i + 1; j < n; j++)
            if (arr[j] < arr[min_idx])
                min_idx = j;

        // Swap the found minimum element
        // with the first element
        swap(&arr[min_idx], &arr[i]);
    }
}

int main()
{
    int n;   //number of elements
    scanf("%d", &n);
    int ints[n], sol[n];
    int size = sizeof(ints)/sizeof(ints[0]); 

    for(int i = 0; i < n; i++){   //taking the inputs from the user
        scanf("%d", &ints[i]);
    }

    ints[n] = selectionSort(ints, size);   //sort the array in ascending order


    for(int i = n-1; i >= 0; i--){   //here is where I am stuck
        
    }
}

我将使用IsGreaterOrEqual函数向前和向后追加2个数字,并返回最大的数字.例如,附加2和21-&gt;221和212.

推荐答案

首先,通过访问超出其ints[n] = ...界限的数组来产生未定义的行为——不知道为什么在进行适当排序时返回一个值.返回值的语义是什么?而是换成void,然后放弃那个作业(job).

i为0时,读取ints[i-1]也会发生同样的情况...

然后try 按integral value对输入进行排序(扫描为int).问题在于:考虑两个值211——显然,较小的值需要放在第一位;然而,如果你现在考虑221,需要先考虑较大的一个.很明显,这表明你是这样排序的.相反,您需要根据文本表示按字典顺序对数字进行排序.

为此,将数字作为C字符串读入适当的数组;确保通过读取超出数组边界的内容来防止未定义的行为,即提供最大长度为scanf(例如,对于32个字符的数组为scanf("%31s", array)),或者可能更喜欢fgetsgetline以及scanf以上的strtok.

您可以 Select 添加一个判断,通过对这些字符串进行迭代并使用is_digit进行判断(为了完全正确,请将输入字符转换为unsigned char for,覆盖char上有符号的值大于127的字符!).

现在,您可以通过strcmp简单地比较这些字符串——然而,您需要对一个字符串作为另一个字符串的前缀进行特殊处理,在最坏的情况下是递归的(余数或旧前缀再次作为另一个的新前缀…).

这可能导致以下代码:

int less(char const* x, char const*y)
{
    size_t nx = strlen(x);
    size_t ny = strlen(y);
    size_t min = nx < ny ? nx : ny;
    int factor = 1;
    for(;;)
    {
        int cmp = strncmp(x, y, min);
        if(cmp != 0)
        {
            return factor * cmp < 0;
        }
        if(nx == ny)
        {
            return 0; // equal -> not less
        }
        if(nx < ny)
        {
            // need to change roles!
            size_t ntmp = nx;
            nx = ny;
            ny = ntmp;
            char const* tmp = x;
            x = y;
            y = tmp;
            factor = -factor;
        }
        nx -= ny;
        x += ny;
    }
}

godbolt...

对于最后一个main,您可以扫描到一个2D字符数组,然后在2D数组中创建一个额外的指针数组(您可以更高效地交换指针),或者一次将所有输入读入一个大的1D字符数组,并用strtok标记,再次将生成的指针放入另一个数组中(我个人更喜欢后一种方法,实际上我会在判断数字时自己做标记,如果这样做的话).现在,使用上面的比较按降序对指针数组进行排序,只需逐个输出数组条目——不需要任何第二个数组(在您的示例中是sol个)...

最后建议:试着理解,如果需要的话,问一个新问题或留下 comments ,然后自己重新实施.这是你学习东西的方式.如果你只是想复制"n"粘贴现成的代码,请随意这样做,我不介意.当时什么也学不到,但我的问题不是;)

C++相关问答推荐

生成C代码时自动复制/生成' tmwtypes.h '依赖项

char为16位且Short也为16位的c环境合法吗

为什么静态说明符为内联函数生成外部定义?

__VA_OPT__(,)是否可以检测后面没有任何内容的尾随逗号?

当我运行/调试C程序时,Malloc()似乎正在将&q;r\r...&q;赋值给一个指针,我不确定为什么?

如何在C客户端应用程序的ClientHello消息中添加自定义扩展?

Rust FFI--如何用给出返回引用的迭代器包装C风格的迭代器?

如何在C中引发/处理自定义信号?

文件权限为0666,但即使以超级用户身份也无法打开

GCC不顾-fno-Builtin-SINCOS旗帜向SINCOS发出呼唤

X64:并发写入布尔数组

用C语言计算文本文件中的整数个数

是否需要包括<;errno.h>;才能使用perror?

如何读取文件并将内容保存在字符串中?(在C语言中,没有崩溃或核心转储错误)

C:Assignment中的链表赋值从指针目标类型中丢弃‘const’限定符

C编译和运行

共享目标代码似乎不能在Linux上的进程之间共享

WSASocket在哪里定义?

为什么程序在打印每个数字之前要等待所有输入?

为什么创建局部变量的指针需要过程在堆栈上分配空间?