宇宙总统
题目描述
算法解析
题目的本质其实是在n个数字中找最大值,但是由于数字会很大,可能到100位数字,因此可能会需要写高精度。
但是本题由于只是比大小,完全可以将数据用字符串来存储,通过字符串来比大小。但是有读者可能会问了:这不是排序题单中的题吗?跟排序有什么关系呢?因此下面将给出2种解题思路。
(1)存储字符串找最大值
与纯数字一样,使用擂台法找出字符串中最大的数字。最大的字符串数字一定是字符串长度最长,且字典序最大的那个,并存储其对应的下标。
【参考代码】
#include
#include
using namespace std;
string a[25];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int max=1; //假设第1个数字最大
for(int i=2;i<=n;i++){
int s=a[max].size();
int t=a[i].size(); //记录两个数字的长度
if(s>t)continue; //max的长度较长,直接下一个数字
else if(s
(2)进行结构体排序,输出第一项
由于在比较过程中,需要比较长度和字典序,同时记录最大值的下标,因此可以使用结构体存储数据,每次存放数字的序号、原始值和长度,进行结构体排序,最后输出排序后的第一项即可。
【参考代码】
#include
#include
using namespace std;
struct PIAO{
int id;
string data;
int len;
}a[25];
bool cmp(PIAO x,PIAO y){
if(x.len!=y.len)return x.len>y.len;
else return x.data>y.data;
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].data;
a[i].id=i;
a[i].len=a[i].data.size();
}
sort(a+1,a+n+1,cmp);
cout<
代码中的C++知识解读
字典序比较
字典序,又称词典顺序或字母顺序,是按照字母顺序排列单词的方式。例如4个单词:“apple”、“banana”、“bag”、“cat”,他们按照字典序的排序结果是:
“apple”
“bag”
“banana”
“cat”
排序规则是:首先按第1个字母的顺序排列,如果相同,再看第2个字母的顺序,以此类推。对于“bag”和“banana”,由于前两个字母相同,第三个字母“g”<“n”,因此“bag”排在“banana”前面。
如果修改三个单词:“Banana”、“Cat”和“6a9”,那么数字和大小写字母该怎么排序呢?我们先给出结果:
“6a9”
“Banana”
“Cat”
“apple”
我们发现,数字<大写字母<小写字母,是不是和ASCII码的规则一样呢?因此我们可以大致使用ASCII码的知识来记忆字典序的排序方式。
在C++中,有三种可以比较字符串字典序的方法:
(1)strcmp(s1,s2)
在C语言中,可以使用strcmp(s1,s2)函数比较两个字符数组型字符串的字典序(即大小)。如果要在C++使用,需要添加头文件#include
当s1
当s1>s2时,函数返回1;
当s1==s2时,函数返回0。
例如:
char s1[10]="apple";
char s2[10]="banana";
cout<
运行结果为:
(2)compare()
在C++中,
使用方法:
string s1="apple";
string s2="banana";
cout<
(3)关系运算符
C++中直接有重载了“<”等关系运算符,可以进行字符串的字典序比较,特别注意的是,如果要进行字符数组型的字符串比较,需要先将字符数组char*强制转换为string再比较。强制转换代码为:
char s1[10]="apple";
cout<
运行结果