C++数组去重复(2)

求n个数中每个数出现的次数

题目描述:从键盘读入n 个整数(n≤100),这n 个数都是1 ~ 10 之间的数,请从小到大输出每个出现过的数,以及统计出每个数出现的次数?比如:假设读入5 个数,分别为1 2 3 3 5 ,统计结果如下:1 出现1 次,2 出现1 次,3 出现2 次,5 出现1 次。输出格式如下:

1 1

2 1

3 2

5 1

输入第1 行输入一个整数n 。第2 行输入n 个整数,用空格隔开。输出输出若干行,每行2 个数,用空格隔开,按照从小到大的顺序,输出每个数以及每个数出现的次数。

输入复制

5

1 2 3 3 5

输出复制

1 1

2 1

3 2

5 1

#include<iostream>
using namespace std;
int main()
{
	int a[100]={0};
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		int s;
		cin>>s;
		a[s]++;
	}
	for(int i=1;i<=n;i++)
	{
		if(a[i]!=0)
		{
			cout<<i<<" "<<a[i]<<endl;
		}
	}
	
	
	return 0;
}

声音识别

题目描述:学校王老师研发了一套新的声音识别系统,该系统预先将每位同学的学号和声音录入之后,只要同学一说话,就知道是哪个学号的同学在说话(不同的同学声音是完全不一样的)王老师将系统装在了教室,系统收集到了一节英语课中同学们说话的n 个片段,并转换为了同学们的学号,请你编程帮助王老师计算出,有多少个同学在英语课中发过言,并按照学号由小到大,输出每位同学的学号及该学号的同学发言的次数。比如,假设经过系统分析,得到如下的88 个同学的学号分别是:8 1 6 1 8 6 7 2,表示同学们的发言顺序分别是:8 号、1 号、6 号、1 号、8 号、6 号、7 号、2 号,那么一共有5位同学发过言,按照学号由小到大输出发言次数如下:

1 2

2 1

6 2

7 1

8 2

分别代表1号同学发言2次、2 号同学发言1 次、6 号同学发言2次、7 号同学发言1 次、8 号同学发言2 次。输入输入有2 行,第1 行有一个整数n(3≤n≤10000);第二行有n 个数字(这些整数都是1~100 之间的整数,含1 和100),数字之间用空格隔开,代表同学们的学号。输出第11 行输出11 个整数,代表总共有多少名同学发过;接下来输出若干行,每行2 个整数,用空格隔开,表示按照学号由小到大输出发言同学的学号及每位同学发言的次数。

输入复制

8

8 1 6 1 8 6 7 2

输出复制

1 2

2 1

6 2

7 1

8 2

#include<iostream>
using namespace std;
int main()
{
	int a[100]={0};
	int n;
	cin>>n;
	int cnt=0;
	int max=-1;
	for(int i=1;i<=n;i++)
	{
		int s;
		cin>>s;
		a[s]++;
		if(s>max)
		{
			max=s;
		}
	}
	for(int i=0;i<=max;i++)
	{
		if(a[i]!=0)
		{
			cnt++;
		}
	}
	cout<<cnt<<endl;
	for(int i=1;i<=max;i++)
	{
		if(a[i]!=0)
		{
			cout<<i<<" "<<a[i]<<endl;
		}
	}
	
	
	return 0;
}

数字出现次数

题目描述:有50 个数(0∼19),求这50个数中相同数字出现的最多次数为几次?输入50 个数字。输出1 个数字(即相同数字出现的最多次数)。

输入复制

1 10 2 0 15 8 12 7 0 3 15 0 15 18 16 7 17 16 9 1 19 16 12 17 12 4 3 11 1 14 2 11 14 6 11 4 6 4 11 13 18 7 0 3 2 3 18 19 2 16(不需要换行)

输出复制

4

#include<iostream>
using namespace std;
int main()
{
	int a[100]={0};
	int n=50;
	int max=-1;
	int maxi=-1;
	for(int i=1;i<=n;i++)
	{
		int s;
		cin>>s;
		a[s]++;
		if(a[s]>maxi)
		{
			max=s;
			maxi=a[s];
		}
	}
	cout<<max;
	
	
	return 0;
}

缺失的数子

题目描述:有n 个数字,值就是1 ~ n ,现发现丢失了2 个数字,请你根据剩余的n -2 个数字,编程计算一下,缺失的是哪两个数字呢?输入第1 行为整数N (N≤100000)。第2 行有N−2 个整数(均用空格隔开)表示了剩下N−2 个数字的值。输出一行,按数字从小到大顺序输出两缺失的数字。两个数字之间用一个空格隔开。

输入复制

6

4 1 3 5

输出复制

2 6

#include<iostream>
using namespace std;
int main()
{
	int a[100]={0};
	int n;
	cin>>n;
	for(int i=0;i<n-2;i++)
	{
		int s;
		cin>>s;
		a[s]=s;
	}
	for(int i=1;i<=n;i++)
	{
		if(a[i]==0)
		{
			cout<<i<<" ";
		}
	}
	
	
	return 0;
}

选班委

题目描述:小T 和他的小伙伴们到CZ 中学的创新实验班报到后的第一件事就是选班委,班主任R 老师走上讲台宣布了选举办法,首先让全班40 位同学依次上讲台做自我介绍,然后按照职位一个一个依次进行选举,先选班长,再选学习委员......,选举办法是每人投一票,谁的票数最高就选谁担任这个职位,最后围棋高手小W 颇具大将风范被选为班长,学神小Z 当选为学习委员那是众望所归,小S 则有天生一副好嗓子,不但歌唱得好,并且能将多种动物的叫声模仿得惟妙惟肖,因此当选为文体委员。小T 同学在本次选举中负责计票,他觉得手工计票太慢了,且容易出错,因此想请你编一个程序实现机器计票功能。这个程序要能实现以下功能:全班共有n 个同学,依次用1 到n 编号,共有m 个人(包括班主任和任课老师等)参与了投票,每张选票上写有一个同学的编号,得票最多的同学当选。输入输入数据第一行包含两个用空格隔开的正整数n 和m,其中n≤200,m≤2000。第二行有m 个用空格隔开的不超过n 的正整数,表示这m 张选票上所写的编号。输出输出得票最多的那个同学的编号。如果同时有两名以上同学得票最多,输出编号最小的那个同学的编号。

输入复制

3 4

1 3 2 1

输出复制

1

#include<iostream>
using namespace std;
int main()
{
	int a[100]={0};
	int n,m;
	cin>>n>>m;
	int max=-1;
	int maxi=-1;
	for(int i=1;i<=m;i++)
	{
		int s;
		cin>>s;
		a[s]++;
		if(a[s]>maxi)
		{
			maxi=a[s];
			max=s;
		}
	}
	cout<<max;
	
	
	return 0;
}

夏令营小旗手

题目描述:夏令营在实验小学进行,组委会决定在实验小学的学生中推选一名小旗手,推选方法如下:实验小学有n 名学生(1≤n≤1000)。每名学生有一个学号,学号为1,2,...n。同时,每名同学有一张选票,可以推选一名同学为小旗手。最后,得票最多者当选,若得票最多者相同票数,则学号小者当选。例如,选票为2 3 4 4 3 4 1 6,4号学生得票最多(3票)当选小棋手。输入第1 行读入n,x1 两个整数,n为学生数,x1 为第一个选票上的学号,之后的选票x i(i≥2)由下面的递推关系给出:

x i =(x i−1 ×37+33031) mod n+1

其中mod 为取余运算,例如,13 mod 8=5,21 mod 21=0。根据这个公式,就能从x1推出x2,x3,...xn。(在C++中,“%”代表取余运算)

输入复制

5 2

输出复制

2

#include<iostream>
using namespace std;
int main()
{
	int a[100]={0};
	int n;
	cin>>n;
	int v;
	cin>>v;
	int max=-1;
	int maxi=-1;
	for(int i=0;i<n;i++)
	{
		a[v]++;
		if(a[v]>maxi)
		{
			maxi=a[v];
			max=v;
		}
		v=(v-1*37+33031)%n+1;
	}
	cout<<max;
	
	
	return 0;
}

求N个整数的平均数、众数和中位数

题目描述:求N 个整数的平均数,众数和中位数。小知识:

1. 众数

如有9 个数:17,13,17,9,17,17,3,16,17,其中17 出现的次数最多,即为这组数的众数。(本题确保测试数据中,出现次数最多的数只有一个)

2. 中位数

如有9 个数:102,170,96,90,97,106,110,182,100。将这9个数按一定的顺序(从大到小或从小到大)排列后得到:182,170,110,106,102,100,97,96,90。正中间的一个数是102 ,102 是这组数的中位数。而这10 个数:106,99,104,120,107,112,33,102,97,100。按一定顺序排列后得到:120,112,107,106,104,102,100,99,97,33。正中间有两个数:104,102 ,中位数就是这两个数的平均数,即(104+102)/2=103.0 。输入第一行为整数N (5≤N≤10000 );第二行为空格隔开的N 个数Ai (0≤Ai≤100)。输出输出空格隔开的平均数众数中位数(平均数保留两位小数,中位数保留一位小数)。

(平均数大家应该都知道)

输入复制

6

5 2 2 3 4 6

输出复制

3.67   2   3.5

#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
	float a[100];
	int b[100];
	float c[100];
	int n;
	int lb=0;
	cin>>n;
	float sum=0;
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
		sum=sum+a[i];
	}
	for(int i=0;i<n;i++)
	{
		bool f=true;
		for(int j=0;j<lb;j++)
		{
			if(a[i]==b[j])
			{
				f=false;
				c[j]++;
				break;
			}	
		}
		if(f==true)
		{
			b[lb]=a[i];
			c[lb]=1;
			lb++;
		}
	}
	int tmp;
	for(int i=0;i<lb-1;i++)
	{
		for(int j=0;j<lb-1-i;j++)
		{
			if(c[j]<c[j+1])
			{
				tmp=c[j];
				c[j]=c[j+1];
				c[j+1]=tmp;
				tmp=b[j];
				b[j]=b[j+1];
				b[j+1]=tmp;
			}
		}
	}
	float q=sum/n;
	cout<<fixed<<setprecision(2)<<q<<" ";
	cout<<b[0]<<" ";
	if(n%2==0)
	{
	    int x=n/2;
	    int y=(n+2)/2;
	    float z=(a[x]+a[y])/2;
	    cout<<fixed<<setprecision(1)<<z;
	}
	else if(n%2==1)
	{
		float s=(n+1)/2;
		cout<<fixed<<setprecision(1)<<s;
	}
	
	
	return 0;
}

找筷子

题目描述:经过一段时间的紧张筹备,电脑小组的“RP餐厅”终于开业了,这天,经理LXC 接到了一个定餐大单,可把大家乐坏了!员工们齐心协力按要求准备好了套餐正准备派送时,突然碰到一个棘手的问题,筷子!CX 小朋友找出了餐厅中所有的筷子,但遗憾的是这些筷子长短不一,而我们都知道筷子需要长度一样的才能组成一双,更麻烦的是CX 找出来的这些筷子数量为奇数,但是巧合的是,这些筷子中只有一只筷子是落单的,其余都成双,善良的你,可以帮CX 找出这只落单的筷子的长度吗?输入第一行读入一个数N,它代表C X找到的筷子的根数。(10≤N≤10000)第二行是N 个用空格隔开的数,代表筷子的长度。(筷子长度都是1∼1000 之间的整数)输出一行,落单的筷子的长度。

输入复制

9

2 2 1 3 3 3 2 3 1

输出复制

2

#include<iostream>
using namespace std;
int main()
{
	int a[100]={0};
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		int s;
		cin>>s;
		a[s]++;
	}
	for(int i=1;i<=n;i++)
	{
		if(a[i]%2==1)
		{
			cout<<i<<" ";
		}
	}
	
	
	return 0;
}

去除重复数字

题目描述:给你N 个数(N≤100),每个数都在(0∼1000)之间,其中由很多重复的数字,请将重复的数字只保留一个,并将剩下的数由小到大排序并输出。输入输入有2 行;第1 行为1个正整数,表示数的个数:N;第2 行有N 个用空格隔开的整数。输出第1 行为1 个正整数M,表示不相同数的个数。接下来的M 行,每行一个整数,表示从小到大排好序的不相同的数。

输入复制

10

20 40 32 67 40 20 89 300 400 15

输出复制

8

15

20

32

40

67

89

300

400

#include<iostream>
using namespace std;
int main()
{
	int a[100]={0};
	int n;
	cin>>n;
	int cnt=0;
	int max=-1;
	for(int i=1;i<=n;i++)
	{
		int s;
		cin>>s;
		a[s]++;
		if(s>max)
		{
			max=s;
		}
	}
	for(int i=0;i<=max;i++)
	{
		if(a[i]!=0)
		{
			cnt++;
		}
	}
	cout<<cnt<<endl;
	for(int i=1;i<=max;i++)
	{
		if(a[i]!=0)
		{
			cout<<i<<" "<<a[i]<<endl;
		}
	}
	
	
	return 0;
}

求n个数中出现次数最多的数

题目描述:从键盘读入n 个整数(n≤100 ),这n 个数都是1∼10 之间的数,请求出出现次数最多的数是哪个数?比如:假设读入5 个数,分别为1 2 3 3 5 ,出现次数最多的数就是3 。(本题的数据确保出现次数最多的数只有1 个,不存在多个数出现的次数都最多的情况)输入第1 行输入一个整数n。第2 行输入n 个整数,用空格隔开。输出输出出现次数最多的数。

输入复制

5

1 2 3 3 5

输出复制

3

#include<iostream>
using namespace std;
int main()
{
	int a[100]={0};
	int n;
	cin>>n;
	int max=-1;
	int maxi=-1;
	for(int i=1;i<=n;i++)
	{
		int s;
		cin>>s;
		a[s]++;
		if(a[s]>maxi)
		{
			max=s;
			maxi=a[s];
		}
	}
	cout<<max;
	
	
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值