/*=====================================
求序列中的众数
总时间限制: 1000ms 内存限制: 65536kB
描述
输入一个长度为N的整数序列 (不多于128个整数),每个整数的范围在[-10^52,10^52],计算这个序列的众数。 众数是指出现次数最多的那个数。 如果有多个数出现的次数都达到最多,则取在原序列最先出现的数为众数;如果所有的数都相等,则返回"no"。 输入
第一行为序列长度N。 然后是N个数据,每一个数的范围都是在[-10^52,10^52]。 注意,这N个数之间可能有若干个空行隔开。 注意,输入数据可能有一些冗余表达信息,具体来说: 1) 正数和0前面可能有前导0和'+'符号,例如
+000123=123
+0000=0
-0000=0
2)每个数字中不含有空格和其他非数字字符,例如不会出现"100 0"或者"- 100"。
3)每个数字前面至多有一个符号,即不会出现+(-1)、-(+4)和-(-1)等情况。
输出
输出只有 1 行: 该序列的众数或者”no”。 如果有多个数出现的次数都达到最多,则取最先出现的数为众数,并且输出形式应该最简形式。 例如,如果原序列众数为+000123,则输出123;如果原序列众数为+0000或者-0000或者0000,输出0。 负数正常输出,例如:如果原序列众数为-000000001111,就输出-1111。
样例输入
6
-00001
10000
00011111111111111111111111111111111111
-01
+000000011111111111111111111111111111111111
-00000000000001
样例输出
-1
======================================*/
总结:
  这个题目假如不是数据范围太大,直接是统计某些整数出现的次数,那就很简单:
用一个数组a存储每一个新出现的数字同时记录每一次扫描到的数字出现的次数,最后扫描数组a,把找到出现次数最多的那个数字就可以输出结果了。
  现在这个题目,数字以字符串的形式出现,而且可能有多余的前缀字符,所以可以考虑对每一次输入的字符串先进行化简操作在按照上面的算法进行统计工作。
步骤:
  1、循环输入每一个字符串数组。
  2、每输入一个字符串,立即进行化简操作(可以用子函数来完成)
化简操作:
  先检测首字符是否‘+’或‘-’并保存检测结果。
  然后扫描字符串,遇到字符‘0’则要考虑该字符是否有效字符(是否需要保存。注意:这里保存到一个临时数组。)。
  如此往复循环处理完字符数组,再把临时数组复制到原数组当中以便返回结果。(这个地方要注意是否需要保留‘-’以及整个数字为0值的时候要特别处理。)
化简完后,在原先的循环体内做字符串出现次数的统计工作,算法和简单数字统计类似。(这里要用到strcmp函数比较两个字符串是否一致。) 统计完后再次扫描数组a寻找出现次数最多的那个字符串即可输出结果。 说的不清楚,看代码吧……
 #include<stdio.h>
#include<string.h>
struct number
{
char n[];//表示化为最简形式后的数
int num;//表示这个数出现的次数。
};
void fun(char a[]);//完成对输入的每个数字进行化简的工作 .结果放在原数组
int main()
{
struct number a[];//存储化简后的数据,每个不同的数存一次,同时记录它的次数
int N,i,len;//共有N个数,len表示a数组已经使用的单元个数
char str1[];
int j;
int max;//众数在数组a的下标 freopen("5.in","r",stdin);
scanf("%d",&N);
len=;
for(i=;i<N;i++)
{
scanf("%s",str1);
fun(str1);//化简刚刚输入的这个字符串
/*printf("%s\n",str1);*/
for(j=;j<len;j++)//检测先前是否遇到过和str1一样的数字
{
if(strcmp(a[j].n,str1)==)
{
a[j].num++;
break;
}
}
if(j>=len)
{
strcpy(a[len].n,str1);
a[len].num=;
len++;
}
}
if(len==&&len<N)//统计完了,a数组只有一个元素。而且输入的数字个数不是只有1个,说明输入的N个数大小是一样的
{
printf("no\n");
}
else
{
max=;//默认第0号是众数所在的位置
for(i=;i<len;i++)
{
if(a[i].num>a[max].num)
max=i;
}
printf("%s\n",a[max].n);
}
/*for(i=0;i<len;i++)
{
printf("%d %s\n",a[i].num,a[i].n);
}*/
return ;
}
void fun(char a[])//完成对输入的每个数字进行化简的工作 .结果放在原数组
{
char temp[];
int len=strlen(a);
int i;
char flag;
int first=;//表示是已经否遇到第一个有效字符
int j=;//记录数组b的长度
int k; //下面检测第一个字符是否是正号或者负号
flag='';
if(a[]=='-') flag='-';
else if(a[]=='+') flag='+'; //根据第一字符的结果决定循环变量i的初值
if(flag!='') i=;
else i=;
//下面是化简数组a代表的数字,结果暂存在temp数组。
for( ;i<len;i++)
{
if(a[i]=='')
{
if(first==)//先前已经遇到了第一个有效字符,所以这个0是有效字符
{
temp[j]=a[i];
j++;
}//如果first==0则是当前这个字符是无效字符,可以直接忽略当前的这个a[i]
}
else
{
first=;//标记一下:遇到了有效字符
temp[j]=a[i];
j++;
}
}
//下面把temp数组存储的化简结果复制到a数组以便返回结果
if(j==)//整个数字是0
{
a[]='';
a[]='\0';
}
else
{
if(flag=='-')
{
a[]=flag;
k=;
}
else
{
k=;
}
for(i=;i<j;i++)
{
a[k]=temp[i];
k++;
}
a[k]='\0';//截止符号
}
}

Openjudge计算概论-求序列中的众数的更多相关文章

  1. OpenJudge计算概论-求分数序列和

    /*======================================================================== 求分数序列和 总时间限制: 1000ms 内存限制 ...

  2. OpenJudge计算概论-求一元二次方程的根【含复数根的计算、浮点数与0的大小比较】

    /*====================================================================== 求一元二次方程的根 总时间限制: 1000ms 内存限 ...

  3. OpenJudge计算概论-求特殊自然数【枚举法】【将整数转成字符串】

    /*======================================================================== 求特殊自然数 总时间限制: 1000ms 内存限制 ...

  4. OpenJudge计算概论-求出e的值

    /*======================================================================== 求出e的值 总时间限制: 1000ms 内存限制: ...

  5. OpenJudge计算概论-求字母的个数(统计元音字母个数)

    /*======================================================================= 求字母的个数 总时间限制: 1000ms 内存限制: ...

  6. OpenJudge计算概论-求满足条件的3位数

    /*======================================================================== 求满足条件的3位数 总时间限制: 1000ms 内 ...

  7. OpenJudge计算概论-求平均年龄

    /*============================================== 求平均年龄 总时间限制: 1000ms 内存限制: 65536kB 描述 班上有学生若干名,给出每名学 ...

  8. OpenJudge计算概论-取石子游戏

    OpenJudge计算概论-取石子游戏[函数递归练习] /*====================================================================== ...

  9. Openjudge计算概论——数组逆序重放【递归练习】

    /*===================================== 数组逆序重放 总时间限制:1000ms 内存限制:65536kB 描述 将一个数组中的值按逆序重新存放. 例如,原来的顺 ...

随机推荐

  1. Interview----用最快的方法计算 Fibonacci 数

    输入 n, 用最快的方法求该 Fibocacci 数列的第 n 项. 方法1: 递归,非常慢 方法2: 迭代,因此计算 f[1] , f[2], f[3] ,,,, 复杂度 O(N) 方法3: 采用以 ...

  2. python的变量作用域

    import time global mark,sum def gaosi(Q): global sum,mark # 在 使用的时候防止隔离 也要声明一下 这个是全局变量 , 引用外面的值 sum+ ...

  3. ASP.NET之Ajax系列(三)

    我们通过前两篇文章的学习,已经大致掌握了Ajax的实现方法,同时也可以对比出两种方式的优劣.但是我们还是没有搞清楚真正的ajax的实现原理,以及最原始的,未经过封装的ajax是什么样的,今天我们一起来 ...

  4. C,C++宏中#与##的讲解[转]

    MoreWindows 专注于Windows编程 C,C++宏中#与##的讲解 文中__FILE__与示例1可以参见<使用ANSI C and Microsoft C++中常用的预定义宏> ...

  5. 使用SCP在命令行传输文件

    下载远程服务器上的文件 scp   root@10.0.10.10:/home/user/download.txt  ./download.txt 上传文件到远程服务器 scp  ./upload.t ...

  6. PHP header() 函数详细说明(301、404等错误设置)

    原文来自:http://www.veryhuo.com/a/view/41466.html 如果您刚刚开始学习PHP,可能有许多函数需要研究,今天我们就来学习一下PHP Header()的使用方法,更 ...

  7. MySQL表名、列名区分大小写详解

    前言:出现的问题 在本地数据库上执行修改银行卡没有报错 但线上执行报错 发现是表找不到,发现表名不对应该是card_cardinfo,但本地上没有问题,能正常修改,然后在数据库里测试,发现本地库(wi ...

  8. Think Python - Chapter 03 - Functions

    3.1 Function callsIn the context of programming, a function is a named sequence of statements that p ...

  9. db2 存储过程 语法 及结果集查询

    第一次用存储过程,关于处理待办的,不知道怎么执行和传参数 给存储过程 ,其实就一句话很简单. @call PRC_MISSIONLIST_QUERY('27020214', '27040000', ' ...

  10. Yii2中自带分页类实现分页

    1.首先写控制器层 先引用pagination类 use yii\data\Pagination; 写自己的方法: function actionFenye(){        $data = Fie ...