标题:数字排序,求解
只看楼主
hanserisgood
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2022-8-16
结帖率:77.78%
已结贴  问题点数:20 回复次数:3 
数字排序,求解
题目:数字排序
问题描述
  给定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;
}
搜索更多相关主题的帖子: 整数 for int 位数 输出 
2022-11-11 21:25
妖妖零
Rank: 2
等 级:论坛游民
威 望:1
帖 子:5
专家分:10
注 册:2022-9-8
得分:10 
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
}
2022-11-11 22:32
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:10 
程序代码:
#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 );
}
2022-11-12 11:32
hanserisgood
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2022-8-16
得分:0 
找到问题了,在嵌套的那个for循环的条件处,应该改为去q<n-1-p;;谢谢各位
2022-11-12 14:56



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-510617-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.177875 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved