c++输入n个字符,根据ASCII码值的大小,输出其中ASCII值第二大和第二小的字符。

不考虑并列的情况

如图所示。只需要排两个仅有3个元素的数组的排序。当然暴力排全部也是可以的,但那种做法提醒不了我的智商。


下图,注意换行也算字符的话,其ASCII码为10是第一小的,所以第二小就成了A


如图,如有疑问或不明白请追问哦!如经常需要问此类问题,可以点个关注哦。

源代码:

#include<stdio.h>

#include <iostream>

#include<algorithm>

using namespace std;

char A0[3]; //替换最小以取第二大

char A2[3]; //替换最大以取第二小

int cnt = 0;

int main() {

int N; 

while(true){

scanf("%d", &N); //读入N(要换行,第一个换行不计入字符)

getchar(); //去掉换行

if (N < 2) {

printf("只有1个字符如何取第二大小?请重新输入!\n");

}

else break;

while ( N-->0 ) {//读入N个字符(之后的换行也算作字符)

char ch = getchar();

if (cnt < 3) {

A2[cnt] = A0[cnt] = ch;

cnt++;

} else{ //已经凑够3个字符

sort(A0, A0 + 3);

sort(A2, A2 + 3);

A2[2] = A0[0] = ch; //替换第3名

}

}

sort(A0, A0 + cnt);

sort(A2, A2 + cnt);

printf("min2='%d'\tmax2='%d'\n", A2[1], A0[cnt-2]); //输出第二小和第二大

std::system("pause"); //防止闪退

return 0;

}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-06-27

题目没有说清楚,如果有并列第一或者并列最小的情况下怎么确定?比较简单的方法就是把这个字符数组进行一下排序,然后再进行输出就可以了。

#include<iostream>

using namespace std;

int main()

{ char a,b,M1,M2,m1,m2;

int i,n;

cin>>n>>a>>b;

if(a>b)M1=a,M2=b,m2=a,m1=b;

else M2=a,M1=b,m1=a,m2=b;

for(i=2; i<n; i++)

{ cin>>a;

if(a>M1)M2=M1,M1=a;

else if(a>M2)M2=a;

if(a<m1)m2=m1,m1=a;

else if(a<m2)m2=a;

}

cout<<m1<<" < "<<m2<<" ...<... "<<M2<<" < "<<M1<<endl;

return 0;

}

因未给出输出格式,如不需要输出最大最小,请自行修改输出语句。

追问

不考虑你说的情况

第2个回答  2019-06-27
先进行排序,
把重复的字符过滤掉,
然后按照要求输出相应字符。
第3个回答  2019-06-27
如果有并列第一或者并列最小的情况下怎么确定?比较简单的方法就是把这个字符数组进行一下排序,然后再进行输出就可以了。
相似回答