数位之和

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 1000000
//小蓝对一个数的数位之和很感兴趣,今天他要按照数位之和给数排序。当两个数各个数位之和不同时,将数位和较小的排在前面,当数位之和相等时,将数值小的排在前面。

//例如,2022 排在 409 前面,因为 2022 的数位之和是 6,小于 409 的数位之和 13。
//
//又如,6 排在 2022 前面,因为它们的数位之和相同,而 6 小于 2022。
//
//给定正整数 n,m,请问对 1 到 n 采用这种方法排序时,排在第 m 个的元素是多少?
typedef struct number
{
    int num;
    int wei_shu_he;
}NUM;
int com(const void* p1, const void* p2);
int main()
{
    NUM arr[N];
    int i, j, k;
    long n, m;

    scanf("%ld", &n);
    scanf("%ld", &m);
    // 填充结构体数组
    for (i = 0, k = 1; i < n; i++, k++)
    {
        arr[i].num = k;
        char* str = (char*)malloc(sizeof(char) * 7);
        //分配内存用于存储数字的字符串表示(最多 6 位数)
        sprintf(str, "%d", k);
        // 将整数 k 转换为字符串
        int len_str = strlen(str);// 获取数字的长度

        arr[i].wei_shu_he = 0; // 初始化位数和为 0
        for (j = 0; j < len_str;j++)
        {
            arr[i].wei_shu_he += str[j] - '0';// 字符转为数字并累加
        }
        // 计算位数和
        free(str);// 释放动态分配的内存
    }
    qsort(arr, n, sizeof(arr[0]), com);
    printf("%d\n", arr[m - 1].num);
}
//按照题意排升序
int com(const void* p1, const void* p2)
{
    NUM* arrA = (NUM*)p1;
    NUM* arrB = (NUM*)p2;

    if (arrA->wei_shu_he != arrB->wei_shu_he)
        return arrA->wei_shu_he - arrB->wei_shu_he;
    else if (arrA->num != arrB->num)
        return arrA->num - arrB->num;
}


qsort函数

#define _CRT_SECURE_NO_WARNINGS
#include<stdlib.h>
#include<stdio.h>
////用qsort排序数组
//int comper1(const void* p1, const void* p2);
//int comper2(const void* p1, const void* p2);
////qsort函数介绍
////void qsort(void * base,//指向待排序数据的起始位置的指针
////              size_t num,//待排序数据的个数
////              size_t size,//待排序的一个数据的长度
////                  int (*comper)(const void* p, const void* p2));//提供的比较方式
//
//int main()
//{
//    int arr[] = { 1,5,2,9,101,12, };
//    int sz = sizeof(arr) / sizeof(arr[0]);
//    qsort(arr, sz, sizeof(arr[0]), comper1);
//    int i = 0;
//    for (i = 0; i < sz; i++)
//    {
//        printf("%d ", arr[i]);
//    }
//    printf("\n");
//    qsort(arr, sz, sizeof(arr[0]), comper2);
//
//    for (i = 0; i < sz; i++)
//    {
//        printf("%d ", arr[i]);
//    }
//    printf("\n");
//    return 0;
//}
////int comper1(const void* p1, const void* p2)//升序
////{
////    //*p1 不能直接解引用因为是void指针类型而且也不能直接+1  -1
////    if (*(int*)p1 > *(int*)p2)
////        return 1;//按qsort函数要求返回>0的数,后面也同样如此
////    else if (*(int*)p1 = *(int*)p2)
////        return 0;
////    else
////        return -1;
////}
//int comper1(const void* p1, const void* p2)//升序
//{
//    return *(int*)p1 > *(int*)p2;
//}
//
//int comper2(const void* p1, const void* p2)//降序
//{
//    return *(int*)p2 > *(int*)p1;
//}

//用qsort函数排序结构体

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 10
//在结构体中用qsort函数
typedef struct student
{
    char name[N];
    int score[3];
    int sum;
}STUDENT;

int qiu_he(STUDENT stu[], int n);
int compare(const void* p1, const void* p2);

int main()
{
    STUDENT stu[N];
    int n, i, j, k;
    scanf("%d", &n);
    for (i = 0; i < n; i++)
    {
        scanf("%s", stu[i].name);
        for (j = 0; j < 3; j++)
        {
            scanf("%d", &stu[i].score[j]);
        }        
    }
    scanf("%d", &k);
    for (i = 0; i < n; i++)
    {
        stu[i].sum=qiu_he(stu, i);
    }
    qsort(stu, n, sizeof(stu[0]), compare);
    printf("%s %d", stu[k-1].name,stu[k-1].sum);

    return 0;
}

int qiu_he(STUDENT stu[], int n)
{
 int j,sum=0;
        
for (j = 0; j <3 ; j++)
    {
    sum += stu[n].score[j];
    }
return sum;
}

int compare(const void* p1, const void* p2)
{
    STUDENT* stuA = (STUDENT*)p1;
    STUDENT* stuB = (STUDENT*)p2;
    if (stuA->sum != stuB->sum)
        return -stuA->sum + stuB->sum;
    else if (stuA->score[0] != stuB->score[0])
        return -stuA->score[0] +stuB->score[0];
    else if (stuA->score[1] != stuB->score[1])
        return -stuA->score[1] + stuB->score[1];
    else
        return strcmp(stuA->name, stuB->name);//如果compare函数(以下简称cmp)返回<0的值,则位置不变,如果cmp返回0,则位置可换可不换,如果cmp函数返回>0的值,那么说明要进行交换
}

计算课堂积分

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

 typedef struct student
{
    long studentID;
    char name[10];//一定要用数组
    int age;
    int score[6];
}STUDENT;
int main()
{
    int i,sum=0;
    STUDENT stu;
    scanf("%ld", &stu.studentID);
    scanf("%s", stu.name);
    scanf("%d", &stu.age);
    for (i = 0; i < 6; i++)
    {
        scanf("%d", &stu.score[i]);
    }
    if (stu.score[0] >= 60)
        sum += 4;
    if (stu.score[1] >= 60)
        sum += 3;
    if (stu.score[2] >= 60)
        sum += 4;
    if (stu.score[3] >= 60)
        sum += 3;
    if (stu.score[4] >= 60)
        sum += 3;
    if (stu.score[5] >= 60)
        sum += 3;
    printf("%8ld %8s %d\n", stu.studentID, stu.name, stu.age);
    printf("%d", sum);
    return 0;
}

点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论