注册 登录
编程论坛 C语言论坛

数字排序,求解

hanserisgood 发布于 2022-11-11 21:25, 1013 次点击
题目:数字排序
问题描述
  给定n个整数,请计算每个整数各位数字和,按各位数字和从大到小的顺序输出。
输入格式
  输入的第一行包含一个整数n,表示给定数字的个数。
  第二行包含n个整数,相邻的整数之间用一个空格分隔,表示所给定的整数。
输出格式
  输出多行,每行包含两个整数,分别表示一个给定的整数和它的各位数字和。按各位数字和递减的顺序输出。如果两个整数各位数字和相同,则先输出值较小的,然后输出值较大的。
样例输入
5
101 100 999 1234 110
样例输出
999 27
1234 10
101 2
110 2
100 1
评测用例规模与约定
  1 ≤ n ≤ 1000,给出的数都是不超过10000的非负整数。

这是我写的,最后运行结果就是没有进行排序,直接按原来的顺序对应输出了,问题应该就出在排序那里,我想不通,求解、
#include<stdio.h>
int weishu(int a)  //判断一个数是几位数;
{
    int wei=0;
    while(a!=0)
    {
        a=a/10;
        wei++;
    }
    return wei;
}
int sumNum(int a)
{
    int sum=0;
    int i,k;
    k=weishu(a);
    for(i=0;i<k;i++)
    {
        sum+=(a%10);
        a=a/10;  
    }
    return sum;    //得到了各位数字之和
}
int main(void)
{
    int n;
    scanf("%d",&n);
    int a[1000]={0};   //all 0   
    int i;
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);     //为数组赋值
    }
    int b[1000]={0};
    for(i=0;i<n;i++)
    {
        b[i]=sumNum(a[i]);       //将每个对应的各位数字之和存进b【i】;
    }
//    for(i=0;i<n;i++)
//    {
//        printf("%d  %d\n",num[i],b[i]);     //打印无序的每个数字;
//    }
    int p,q;
    for(p=0;p<n-1;p++)
    {
        for(q=0;q<n-1-i;q++)
        {
            if((b[q]==b[q+1])&&(a[q]<a[q+1]))        //第一层过滤,如果有各位数字之和相等的特殊情况的话就交换a数组
            {
                int temp;
                temp=a[q];                 // b就不换了,毕竟相等
                a[q]=a[q+1];
                a[q+1]=temp;
            }
        
            else if(b[q]<b[q+1])        
            {
                int temp2,temp3;
                temp2=a[q],temp3=b[q];
                a[q]=a[q+1],b[q]=b[q+1];
                a[q+1]=temp2,b[q+1]=temp3;
            }
        }
    }
   
    for(i=0;i<n;i++)
    {
        printf("%d  %d\n",a[i],b[i]);
    }
    return 0;
}
3 回复
#2
妖妖零2022-11-11 22:32
for(i=0;i<n-1;i++)   //冒泡排序
{
    int flag=0;
    for(int j=0;j<n-i-1;j++)
    {
        if(b[j]<b[j+1])    //将最小的项移到最后以此类推
        {
            flag=1;
            int temp=b[j+1];  //交换位置
            b[j+1]=b[j];
            b[j]=temp;
            temp=a[j+1];
            a[j+1]=a[j];
            a[j]=temp;
        }
    }
    if(flag==0) break; //如果数组从大到小排则flag=0
}
#3
rjsp2022-11-12 11:32
程序代码:
#include <stdio.h>
#include <stdlib.h>

struct foo
{
    unsigned a;
    unsigned b;
};

int comp( const void* lhs, const void* rhs )
{
    const struct foo* p = (const struct foo*)lhs;
    const struct foo* q = (const struct foo*)rhs;
    if( p->b < q->b ) return +1;
    if( p->b > q->b ) return -1;
    if( p->a < q->a ) return -1;
    if( p->a > q->a ) return +1;
    return 0;
}

int main( void )
{
    size_t n;
    scanf( "%zu", &n );

    struct foo buf[1000];
    for( size_t i=0; i!=n; ++i )
    {
        scanf( "%u", &buf[i].a );

        buf[i].b = 0;
        for( unsigned t=buf[i].a; t!=0; t/=10 )
            buf[i].b += t%10;
    }

    qsort( buf, n, sizeof(*buf), &comp );

    for( size_t i=0; i!=n; ++i )
        printf( "%u %u\n", buf[i].a, buf[i].b );
}
#4
hanserisgood2022-11-12 14:56
找到问题了,在嵌套的那个for循环的条件处,应该改为去q<n-1-p;;谢谢各位
1