数位之和
#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 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复