一、知识点
1、pow函数
引用头文件math.h
求x的y次方
2、链接数学库
math.h头文件对应的库名称是libm
sudo find / -name libm.so -print
ls /usr/lib/x86_64-linux-gnu/
链接命令:gcc xxx.c -L. -lm
3、52进制
A的ASCII码是65,Z的ASCII码是90,a的ASCII码是97,z的ASCII码是122
大小写字母总共是52个
从A到Z,分别对应0到25
从a到z,分别对应26到51
二、题目
1、描述
给定n个字符串,请对n个字符串按照字典序排列
2、数据范围
1<=n<=100,字符串长度满足:1<=len<=100
3、输入描述
输入第一行为一个正整数n(1<=n<=1000),下面n行为n个字符串(字符串长度<=100),字符串中只含有大小写字母
4、输出描述
数据输出n行,输出结果为按照字典序排列的字符串
三、自己的解题思路
设置52进制
从A到Z,用数字0到25表示
从a到z,用数字26到51表示
字符串长度为100,下标从0到99,权重分别是pow(52,99),pow(52,98)..............pow(52,0)
下标为i的字母的数值用temp(0~51)表示,所以,该字母的权重就是temp*pow(52,99-i);
字符串的权重就是字符串所有字母权重的和
所有字符串的权重从小到大的排序就是所有字符串的字典序排序
四、自己写的代码
#include<stdio.h>
#include<math.h>
int main() {int n, i, j, temp;double min;scanf("%d", &n);char line[n][102];double weight[n];for (i = 0; i < n; i++) {scanf("%s", line[i]);}for (i = 0; i < n; i++) {weight[i] = 0;j = 0;while (line[i][j] != '\0') {if (line[i][j] <= 'Z') {temp = line[i][j] - 'A';} else {temp = line[i][j] - 'a' + 26;}weight[i] += temp * pow(52, (99 - j));j++;}}while (1) {min = pow(52, 102);for (i = 0; i < n; i++) {if (weight[i] < min) {min = weight[i];}}if (pow(52, 102) - min < 1) {break;}for (i = 0; i < n; i++) {if (weight[i] - min < 1) {printf("%s\n", line[i]);weight[i] = pow(52, 102);i = n;}}}return 0;
}