首页 > 编程语言 >问题 F: 零基础学C/C++176——生日相同问题

问题 F: 零基础学C/C++176——生日相同问题

时间:2022-11-08 17:44:14浏览次数:47  
标签:name 相同 int C++ 日期 strcpy printf 176 生日


首先题目也很明确的要求了按照日期从前到后,若日期相同,则比的是名字从短到长顺序输出,长度相同的按字典序输出。如果没有生日相同的学生,输出None。
所以这题的一大难点也就是排序,如果我们先找出生日日期相同的人,在对其进行名字的排序,可能会十分复杂,所以我们可以先对其名字进行排序,再从中抽出日期相同的人,这样当我们抽出来的时候他们的名字就是已序的啦!
同时这题还有另一大难点,就是寻找日期相同的人,如果我们用暴力搜索的话,很大概率会时间超限,那么我们必须就要改变方法
还记得之前160题时候的字符串么,我运用到了桶的方法,这题也同样,但是日期怎么放入桶中呢。其实也很简单,用二维数组就好啦!

点击查看代码
#include<stdio.h>
#include<string.h>
struct stu
{
	char name[20];
	int m;
	int d;
};
int main()
{
	struct stu a[180];
	int n;
	int b[32][32] = { 0 };
	char c[20];
	int i;
	int t;
	int j;
	int k;
	scanf("%d\n", &n);
	for (i = 1; i <= n; i++)
	{
		scanf("%s %d %d\n", a[i].name, &a[i].m, &a[i].d);
	}
	for (i = 0; i <= n; i++)//按照名字的要求进行排序
	{
		for (j = i; j < n; j++)
		{
			if (strlen(a[i].name) > strlen(a[j].name))
			{
				strcpy(c, a[i].name);
				strcpy(a[i].name, a[j].name);
				strcpy(a[j].name, c);
				t = a[i].m;
				a[i].m = a[j].m;
				a[j].m = t;
				t = a[i].d;
				a[i].d = a[j].d;
				a[j].d = t;
			}
			else if (strlen(a[i].name) == strlen(a[j].name))
			{
				if (strcmp(a[i].name,a[j].name)>0)
				{
					strcpy(c, a[i].name);
					strcpy(a[i].name, a[j].name);
					strcpy(a[j].name, c);
					t = a[i].m;
					a[i].m = a[j].m;
					a[j].m = t;
					t = a[i].d;
					a[i].d = a[j].d;
					a[j].d = t;
				}
			}
		}
	}
	for (i = 0; i < n; i++)//利用桶来记录每个日记有多少人生日
	{
		b[a[i].m][a[i].d]++;
	}
	int f = 0;
	for (i = 1; i <= 12; i++)
	{
		for (j = 1; j <= 31; j++)
		{
			if (b[i][j] > 1)//若大于1,则可以输出对应名字
			{
				printf("%d %d", i, j);
				f = 1;
				for (k = 0; k < n; k++)//顺序查找,那么经过之前的排序,我们就可以直接对应输出名字已经排好序的人啦
				{
					if (a[k].m == i && a[k].d == j)
					{
						printf(" %s", a[k].name);
					}
				}
				printf("\n");
			}
		}
	}
	if (f == 0)//若没有一个二维数组上的数大于1,则没有生日相同的人
	{
		printf("None\n");
	}
}

标签:name,相同,int,C++,日期,strcpy,printf,176,生日
From: https://www.cnblogs.com/myy-zzb/p/16870568.html

相关文章

  • 问题 N: 零基础学C/C++159——最长字符串
    题目一点也不难哦,就是要学会二维数组的输入输出但是不知为何这题有一个很奇怪的坑,如果你是AC:83%那么恭喜你掉坑里了!!这道题目竟然有一个检测点在最后的时候加\n确实......
  • 问题 M: 零基础学C/C++158——删除中间的*
    思路很简单,但实现起来有点麻烦。将前面2题融合(前两题我就觉得没必要放了哈哈哈哈),保留前面与后面的*都改成删除即可。你会发现我的代码是前两个的融合。要学会融会贯通鸭:......
  • C++ 何时需要使用 引用 & ?
    原因:在C++中,由于以下原因,变量通过引用传递:1)要修改调用者函数的局部变量:引用(或指针)允许被调用函数修改调用者函数的局部变量。例如,考虑以下示例程序,其......
  • C++ 关于size()和sizeof()的区别
    sizeof(a)返回的是对象占用内存的字节数,而a.size()是string类定义的一个返回字符串大小的函数,两个是完全不一样的概念。明确两者的概念和作用:1、size()函数:c++中,在获取字......
  • 《数据结构与算法分析(C++语言描述)》
    在看这本书总结了笔记,并分享出来。有问题请及时联系博主:​​Alliswell_WP​​,转载请注明出处。书籍:《数据结构与算法分析(C++语言描述)》作者:LarryNyhoff著、黄达明等译源代......
  • C++学习
     平时有时间也可以刷一刷​​leetcode​​​,​​hihocoder​​,很多题目思考起来还是很有意思的。对于其他的课本,我觉得《算法导论》《编程珠玑》《编程之美》都是不错的经......
  • C/C++ 编程
    写一个函数找出一个整数数组中,第二大的数 constintMINNUMBER=-32767;intfind_sec_max(intdata[],intcount){intmaxnumber=data[0];i......
  • Xmake v2.7.3 发布,包组件和 C++ 模块增量构建支持
    Xmake是一个基于Lua的轻量级跨平台构建工具。它非常的轻量,没有任何依赖,因为它内置了Lua运行时。它使用xmake.lua维护项目构建,相比makefile/CMakeLists.txt,配置语......
  • pip error: Microsoft Visual C++ 14.0 or greater is required
    https://zhuanlan.zhihu.com/p/471661231去官网下载cpp编译工具:https://my.visualstudio.com/Downloads/Featured?mkt=zh-cn下载后直接安装默认值比起有的教程安装......
  • C++ 不知图系列之基于邻接矩阵实现广度、深度搜索
    1.前言图是一种抽象数据结构,本质和树结构是一样的。图与树相比较,图具有封闭性,可以把树结构看成是图结构的基础部件。在树结构中,如果把兄弟节点之间或子节点之间横向连接,......