按数字和大小依次输出各数

按数字和大小依次输出各数
输入n个正整数(1<n<=10),然后按照每个数的数字和(取该数的各位数字相加)的大小,从大到小输出这n个数(如果其中有几个数的数字和相同,则这几个数按其输入时的先后顺序输出)

输入格式:
先输入n;
再输入n个正整数

输出格式:
按数字和的大小从大到小输出这n个数,数与数之间用“,”进行分隔。

输入样例:
10
1 2 3 4 5 11 12 13 21 22
输出样例:
5,4,13,22,3,12,21,2,11,1
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
以下是C语言的代码实现:

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

// 计算数字和
int digit_sum(int n)
{
    int sum = 0;
    while (n)
    {
        sum += n % 10;
        n /= 10;
    }
    return sum;
}

// 比较函数,用于排序
int cmp(const void *a, const void *b)
{
    int x = *(int*)a, y = *(int*)b;
    int sum_x = digit_sum(x), sum_y = digit_sum(y);
    if (sum_x != sum_y) return sum_y - sum_x;  // 按数字和从大到小排序
    else return x - y;  // 如果数字和相同,按输入时的先后顺序排序
}

int main()
{
    int n, i;
    int a[10];
    scanf("%d", &n);
    for (i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
    }
    qsort(a, n, sizeof(int), cmp);  // 使用快速排序算法排序
    for (i = 0; i < n; i++)
    {
        printf("%d", a[i]);
        if (i != n - 1) printf(",");
    }
    return 0;
}

首先定义了一个函数 digit_sum,用于计算一个数的数字和。然后定义了一个比较函数 cmp,用于排序。在 cmp 函数中,先计算两个数的数字和,如果数字和不同,则按数字和从大到小排序;如果数字和相同,则按输入时的先后顺序排序。最后使用 qsort 函数进行排序。

在主函数中,先读入输入的数列,然后调用 qsort 函数进行排序。最后按照排序后的顺序输出数列中的数,数与数之间用逗号进行分隔。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

  • 这篇博客: C语言质数的简单判断和输出中的 题目1:对于给定的一个大于 1 的正整数 N(你可以认为测评机给出的 N 均小于 1000),按从小到大的顺序输出所有小于等于它的质数。输出格式请按从小到大的顺序输出所有小于等于 N 的质数,一个数单独占一行。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 2也是质数,不要遗忘

    #include <stdio.h>
    int prime(int x){
    	int i;
    	for(i=3;i*i<x;i+=2)
    		if(x%i==0)
    			return 0;
    	return 1;
    }
    int main() {
        int i;
        int j;
        int N;
        scanf("%d",&N);
        if(N>=2){
            printf("2\n");
        }
        for(i=3; i<=N; i+=2){
            if(prime(i)){
    			printf("%d\n",i);
    		}
        }
    
        return 0;
    }
    

你可以用冒泡实现,执行时间和效率都很不错:

img

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

#define MAX_N 10

int digits_sum(int n) {
    int sum = 0;
    while (n > 0) {
        sum += n % 10;
        n /= 10;
    }
    return sum;
}

int main() {
    int n;
    scanf("%d", &n);

    int nums[MAX_N];
    int sums[MAX_N];
    for (int i = 0; i < n; i++) {
        scanf("%d", &nums[i]);
        sums[i] = digits_sum(nums[i]);
    }

    for (int i = 0; i < n; i++) {
        for (int j = i + 1; j < n; j++) {
            if (sums[j] > sums[i] || (sums[j] == sums[i] && j < i)) {
                int temp_sum = sums[i];
                sums[i] = sums[j];
                sums[j] = temp_sum;
                int temp_num = nums[i];
                nums[i] = nums[j];
                nums[j] = temp_num;
            }
        }
    }

    for (int i = 0; i < n; i++) {
        printf("%d", nums[i]);
        if (i != n - 1) {
            printf(",");
        }
    }
    printf("\n");

    return 0;
}


供参考:

#include <stdio.h>
#define N 11
int s(int n)
{
    int s = 0;
    while(n) {
        s += n % 10;
        n /= 10;
    }
    return s;
}
int main()
{
    int a[N], n, i, j, t;
    scanf("%d", &n);
    for (i = 0;i < n; i++)  //输入
        scanf("%d", &a[i]);

    for (i = n - 1;i > 0; i--) // 排序
    {
        for (j = 0; j < i; j++)
            if (s(a[j]) < s(a[j+1]))
            {
                t = a[j]; a[j] = a[j+1]; a[j+1] = t;
            }
    }

    for (i = 0;i < n; i++) // 输出排序后的数组
        printf(i ? ",%d" : "%d", a[i]);

    return 0;
}