一、知识点
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;
}