如何查看数字在数组中是否具有相同的数字?

时间:2018-11-15 19:12:21

标签: c algorithm

我对自己的问题有些困惑,不是因为我不知道,而是因为我无法使用更复杂的操作(函数和多个数组)

所以我需要用C编写一个程序,要求输入一个数组(最多100个元素),然后程序需要按具有相同数字的数字对该矩阵进行排序。

所以我做了我所知道的一切,我使用排序算法(从最小值到最大值)对程序进行了测试,并且可以正常工作,唯一我不明白的是如何测试数字是否在循环内具有相同的数字? (我不能使用函数。)

因此,我知道查找数字是否具有相同数字的方法,但是我不知道如何进行比较。这是我需要的示例。

这就是我现在所拥有的,它将数字从最小到最大排序。

#include <stdio.h>

int main() {

    int matrix[100];
    int i,j;
    int temp,min;
    int elements_number=0;

    printf("Enter the values of matrix-max 100 elements-type -1 to end: ");

    for(i=0;i<100;i++){
    scanf("%d",&matrix[i]);
    elements_number++;
    if(matrix[i]==-1){
        elements_number--;
        break;
     }
    }

    for (i=0; i<elements_number; i++) {
    min=i;
    for (j=i+1; j<elements_number; j++) {
        if (matrix[j] < matrix[min])
            min = j;
        }
        temp = matrix[i];
        matrix[i] = matrix[min];
        matrix[min] = temp;
    }

    for(i=0;i<elements_number;i++){
        if(i!=elements_number-1){
        printf("%d,",matrix[i]); }
        else   printf("%d.",matrix[i]);

    }
    return 0;
}

我需要这些数字的输出:

INPUT :
    1 22 43 444 51 16 7 8888 90 11 -1

OUTPUT: 
    1,22,444,7,8888,11,43,51,16,90.

以1位数计数的整数作为“具有相同位数的数字”,例如本例中的7和1。

希望可以为您提供帮助。

1 个答案:

答案 0 :(得分:0)

处理完数组后,个位数应全部在数组的左侧,其他数字应在右侧。在每个部分中,应保留元素的原始顺序。这称为稳定分区。它与排序不同,因为元素仅分为两组。排序意味着数组中任何两个元素之间都有明确的关系。

这可以通过“过滤”单个数字的数组并将存储的其他数字存储在临时的第二个数组中来完成。然后将第二个数组的内容附加到(现在更短的)第一个数组中。

这是可行的方式:

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

void print(const int *arr, int n)
{
    for (int i = 0; i < 10; i++) {
        if (i) printf(", ");
        printf("%d", arr[i]);
    }

    puts(".");
}

int is_rep_digit(int n)
{
    int q = n % 10;

    n /= 10;

    while (n) {
        if (n % 10 != q) return 0;
        n /= 10;
    }

    return 1;
}

int main()
{
    int arr[10] = {1, 22, 43, 444, 51, 16, 7, 8888, 90, 11};
    int aux[10];    // auxliary array for numbers with several digits

    int i, j, k;

    print(arr, 10);

    j = 0;                              // number of single-digit numbers
    k = 0;                              // number of other numbers

    for (i = 0; i < 10; i++) {
        if (is_rep_digit(arr[i])) {
            arr[j++] = arr[i];          // pick single-digit number
        } else {
            aux[k++] = arr[i];          // copy other numbers to aux
        }
    }

    k = 0;    
    while (j < 10) {                    // copy aux to end of array
        arr[j++] = aux[k++];
    }

    print(arr, 10);

    return 0;
}

编辑:我刚刚看到了您对不能使用函数的要求。您可以使用Barmar的建议以1,11,111等来检验可除性。但是,棘手的部分是找到正确的除数。

无论如何,我想在这里说明的是,这里不需要完整的排序算法。