C语言 Perm函数不计算大于99的数字

ev7lccsx  于 2023-01-25  发布在  其他
关注(0)|答案(1)|浏览(122)

我需要从标准输入中读取要分析的自然数N,然后程序必须读取这N个数,并在标准输出的一行中打印出可以分析的自然数,方法是移动记录中的数字,将其转换为读取的其他数字之一。
示例:键盘输入:
6
25 21 10242 42210 52 24021
输出:5

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef unsigned long long int cache;

int cmp(const void * a, const void * b) {
    return ( * (int * ) a - * (int * ) b);
}

int main() {
    int n, i, j, count_equals = 0;
    char num[22];
    scanf("%d", & n);
    cache * A = (cache * ) malloc(n * sizeof(cache));
    for (i = 0; i < n; i++) {
        scanf("%s", num);
        qsort(num, strlen(num), sizeof(char), cmp);
        for (A[i] = num[--j] - '0'; --j >= 0; A[i] = A[i] * 10 + (num[j] - '0'));
    }
    qsort(A, n, sizeof(cache), cmp);
    for (j = 0, i = 1; i < n; i++) {
        if (A[i] == A[i - 1]) { 
            count_equals++;
        } else if (count_equals) {
            j += ++count_equals, count_equals = 0;
        }
    }
    if (count_equals) {
        j += ++count_equals;
    } 
    free(A);
    printf("%d\n", j);
    return 0;
}

问题是:它没有得到/计算更长的数字,而且qsort()可能不是这里的最佳解决方案。
你有什么建议?

pgvzfuti

pgvzfuti1#

不能对charcache数组使用相同的比较函数。比较函数需要将void*参数强制转换为它们的实际类型。

int cmp_char(const void * a, const void * b) {
    return ( * (char * ) a - * (char * ) b);
}

int cmp_cache(const void * a, const void * b) {
    return ( * (cache * ) a - * (cache * ) b);
}

然后,每次调用qsort()时使用正确的值

qsort(num, strlen(num), sizeof(char), cmp_char);
qsort(A, n, sizeof(cache), cmp_cache);

相关问题