Openjudge计算概论-求序列中的众数
/*=====================================
求序列中的众数
总时间限制: 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计算概论-求序列中的众数的更多相关文章
- OpenJudge计算概论-求分数序列和
/*======================================================================== 求分数序列和 总时间限制: 1000ms 内存限制 ...
- OpenJudge计算概论-求一元二次方程的根【含复数根的计算、浮点数与0的大小比较】
/*====================================================================== 求一元二次方程的根 总时间限制: 1000ms 内存限 ...
- OpenJudge计算概论-求特殊自然数【枚举法】【将整数转成字符串】
/*======================================================================== 求特殊自然数 总时间限制: 1000ms 内存限制 ...
- OpenJudge计算概论-求出e的值
/*======================================================================== 求出e的值 总时间限制: 1000ms 内存限制: ...
- OpenJudge计算概论-求字母的个数(统计元音字母个数)
/*======================================================================= 求字母的个数 总时间限制: 1000ms 内存限制: ...
- OpenJudge计算概论-求满足条件的3位数
/*======================================================================== 求满足条件的3位数 总时间限制: 1000ms 内 ...
- OpenJudge计算概论-求平均年龄
/*============================================== 求平均年龄 总时间限制: 1000ms 内存限制: 65536kB 描述 班上有学生若干名,给出每名学 ...
- OpenJudge计算概论-取石子游戏
OpenJudge计算概论-取石子游戏[函数递归练习] /*====================================================================== ...
- Openjudge计算概论——数组逆序重放【递归练习】
/*===================================== 数组逆序重放 总时间限制:1000ms 内存限制:65536kB 描述 将一个数组中的值按逆序重新存放. 例如,原来的顺 ...
随机推荐
- Ubuntu安装软件提示”需要安装不能信任的软件包”解决办法
用 Ubuntu 安装输入法软件包时提示"需要安装不能信任的软件包","这个动作需要从没有授权的软件源来安装软件包",赋予权限执行仍然无法安装,上网查了一下,只 ...
- 文件操作II
<html> <head> <meta charset="utf-8"> </head> <body> <?php ...
- Object-C 基础笔记3---属性
一,区别属性和实例变量 实例变量就是声明在接口大括号里面的变量.@public类型的实例变量直接使用->访问, property 属性是一组设置器和访问器,属性是方法不是变量. 与类相似,属性需 ...
- matio使用
http://na-wiki.csc.kth.se/mediawiki/index.php/MatIO (1)build根据教程 (2)sudo ldconfig (3)写main根据链接:修改几个类 ...
- I.MX6 Android 5.1 快速合成系统
/**************************************************************************** * I.MX6 Android 5.1 快速 ...
- ajax 向后台传对象
$.ajax({ url : "accreditSurveyInfo.action", data : $("form").serialize(), dataTy ...
- Day06_面向对象第一天
1.JAVA中的参数传递问题(掌握) 基本类型 形式参数的改变对实际参数没有影响 基本类型的实际参数和形式参数可以看作两个变量,这两个变量分别操作各自的数据,所以互不影响 引用类 ...
- JDBC存取二进制文件示例
PutFile.java import java.io.File; import java.io.FileInputStream; import java.sql.*; public class Pu ...
- ORA-12545: 因目标主机或对象不存在, 连接失败
ORA-12545: 因目标主机或对象不存在, 连接失败 1. 问题描述 XP系统下同时安装了AX1应用程序和升级版AX2,连接同一个在本机Oracle客户端上配置的连接实例,其中AX2显示链接成功, ...
- ~0u >> 1
~ 逐位求反u 后辍为 定义unsigned类型>>右移如在32系统中,连起来就是 将32位的0取反后 右移一位.也就是 int 的最大值 2147482347