</pre><pre name="code" class="cpp">/*
* 思路:
* 1,输入数字
* 2,判断数字的第一位是不是+,-,如果是,保留,如果不是,那么将所有其他字符后移一位并将字符串的第一个位置置为+
* 3,之后,从字符串第二位开始寻找到第一个不是,‘0’的字符,如果到字符串结尾的时候依然是'0',那么该字符串代表数字0,将字符串第三位的值置为字符串的结束符,值为0,并且将其第一位置为+(因为可能有输入为-000这种情况).
* 4,将该临时字符串与已经保存的字符串进行匹配,如果找到相同的,那么该相同的的count+1,否则,增加一个新的数字到已经保存的数组中,将其count+1
* 5, 录入完成后,遍历整个数组,寻找count(即程序中结构体中的c)最大的值,保存为max
* 6,重新遍历,搜索岛第一个count为max的数
* 7,如果这时候,q[1].n[0] == 0,表示所有的数字都是一样的,那么我们输出no
* 8,否则的话,所有的数字不是都一样的,那么我们输出该数字。
*/
#include<iostream>
#include<cmath>
#include<iomanip>
#include<string.h>
using namespace std;
int main()
{
struct dedema//随便建了一个结构,里边n代表用字符表示的数字,c代表这个数字出现的次数
{
char n[100];
int c;
};
struct dedema q[150] =
{ };
int n;
int i, j;
int pos; //指针,用于锁定数字中除了+,-以外,第一个非0的字符
int max = 0;
char tn[150] =
{ };
int count = 0;
cin >> n;
for (i = 0; i < n; i++)//输入,以及输入的处理
{
cin >> tn;//输入数字
pos = 0;//置pos为0
if (tn[pos] >= '0' && tn[pos] <= '9')
{
for (j = strlen(tn); j > 0; j--)
{
tn[j] = tn[j - 1];
}
tn[0] = '+';
}
pos = 1;
while (tn[pos] == '0')
pos++;
if (pos == strlen(tn))
{
tn[2] = 0;
tn[0] = '+';
}
else
{
strcpy(&tn[1], &tn[pos]);
}
for (j = 0; j < count; j++)
{
if (!strcmp(q[j].n, tn))
{
q[j].c++;
break;
}
}
if (j == count)
{
strcpy(q[j].n, tn);
q[j].c++;
count++;
}
memset(tn, 0, 140);
}
for (i = 0; i < count; i++)
{
if (q[i].c > max)
max = q[i].c;
}
if (q[1].c == 0)
{
cout << "no" << endl;
}
else
{
for (i = 0; i < count; i++)
{
if (q[i].c == max)
{
if (q[i].n[0] == '-')
cout << q[i].n << endl;
else
cout << &q[i].n[1] << endl;
break;
}
}
}
return 0;
}
【Openjudge】求序列中的众数
最新推荐文章于 2022-06-16 19:40:39 发布