化繁就简(结构体在算法中的运用)

简介: 化繁就简(结构体在算法中的运用)

化繁就简(结构体在算法中的运用)

题目

某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。

这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过200岁的老人,而今天是2014年9月6日,所以超过200

岁的生日和未出生的生日都是不合理的,应该被过滤掉。

输入描述:

输入在第一行给出正整数N,取值在(0, 105];随后N行,每行给出1个人的姓名(由不超过5个英文字母组成的字符串)、以及

按“yyyy/mm/dd”(即年/月/日)格式给出的生日。题目保证最年长和最年轻的人没有并列。

输出描述:

在一行中顺序输出有效生日的个数、最年长人和最年轻人的姓名,其间以空格分隔。

输入例子:

5

John 2001/05/12

Tom 1814/09/06

Ann 2121/01/30

James 1814/09/05

Steve 1967/11/20

输出例子:

3 Tom John

*/

我的算法

#include <stdio.h>
#include <string.h>
int main(void)
{
  int n, cnt = 0;
  int y, m, d;
  int t, flag = 1, flag2 = 0;
  int i, j, k;
  int mi, mj, mk, ni, nj, nk;
  char name1[10], name2[10];
  char name[10];
  scanf ("%d", &n);
  t = n;
  getchar ();
  while (t--)
  {
    scanf (" %s %d/%d/%d", name, &y, &m, &d);
    if ((1814 <= y && y <= 2014))
    {
      if (y == 2014)
      {
        if (m <= 9 && d <= 6)
        {
          cnt++;
          flag2 = 1;
        }
      }
      else if (y == 1814)
      {
        if (y >= 9 && d >= 6)
        {
          cnt++;
          flag2 = 1;
        }
      }
      else
      {
        cnt++;
        flag2 = 1;
      }
      if (flag && flag2)
      {
        strcpy (name1, name);
        mi = 2014 - y;
        mj = m - 9;
        mk = d - 6;
        strcpy (name2, name);
        ni = 2014 - y;
        nj = m - 9;
        nk = d - 6;
        flag = 0;
      }
      if (flag == 0)
      {
        i = 2014 - y;
      j = m - 9;
      k = d - 6;
      if (i >= mi)
      {
        if (i == mi)
        {
          if (j >= mj)
          {
            if (j == mj)
            {
              if (k > mk)
              {
                strcpy (name1, name);
                mi = i;
                mj = j;
                mk = k;
              }
            }
            else
            {
              strcpy (name1, name);
              mi = i;
              mj = j;
              mk = k;
            }
          }
        }
        else
        {
          strcpy (name1, name);
          mi = i;
          mj = j;
          mk = k;
        }
      }
      if (i <= ni)
      {
        if (i == ni)
        {
          if (j <= nj)
          {
            if (j == nj)
            {
              if (k < nk)
              {
                strcpy (name2, name);
                ni = i;
                nj = j;
                nk = k;
              }
            }
            else
            {
              strcpy (name2, name);
              ni = i;
              nj = j;
              nk = k;
            }
          }
        }
        else
        {
          strcpy (name2, name);
          ni = i;
          nj = j;
          nk = k;
        }
      }
      }
    }
  }
  printf ("%d ", cnt);
  for (i = 0; name1[i] != '\0'; i++)
  {
    putchar (name1[i]);
  }
  putchar (' ');
  for (i = 0; name2[i] != '\0'; i++)
  {
    putchar (name2[i]);
  }
  return 0;
}
*/ 

好的算法1(结构体)

c语言

// 这是用的结构体原理,这也是一般人看见这个题目一般的好的想法

// 个人推荐,但是后面还有个更好的写法

#include<stdio.h> 
struct birth    
  {
    char name[6];
    int y;
    int m;
    int d;
  }a, max, min;
int main()
{ 
  int n, cnt = 0;
  scanf("%d", &n);   // 几个待处理的数据 
  max.y = 2014; max.m = 9;max.d = 7;     // 两个边界 
  min.y = 1814; max.m = 9; max.d = 5; 
  cnt = n; 
  for(int i = 0; i < n; i++)
  {
    scanf("%s %d/%d/%d", &a.name, &a.y, &a.m, &a.d);  // 按题目要求的输入 
    if(a.y > 2014 || (a.y == 2014 && a.m > 9) || (a.y == 2014 && a.m == 9 && a.d > 6) || a.y < 1814 || (a.y == 1814 && a.m < 9) || (a.y == 1814 && a.m == 9 && a.d < 6))
    {
      cnt--;      // 这个if条件里面包含的了所有非法的条件,每次不满足条件就cnt(总处理个数-1) 
      continue;   // 让后跳过这次循环 
    }
    if(a.y < max.y || (a.y == max.y && a.m < max.m) || (a.y == max.y && a.m == max.m && a.d < max.d))
    {
      max = a;    // 这个是找最大的情况的一个判断 
    }
    if(a.y > min.y || (a.y == min.y && a.m > min.m) || (a.y == min.y && a.m == min.m && a.d > min.d))
    {
      min = a;    // 这个是找最小的情况的一个判断 
    }
  }
  printf("%d", cnt);    // 输出 
  if(cnt != 0)
  {
    printf(" %s %s",max.name, min.name);
  }
  return 0;
 }  

好的算法2(不使用结构体)

// 这是一个不用结构体的方法 
#include <iostream>
using namespace std;
#include <cstring>
int main()
{
  char max[6], min[6], name[6];  // 用来装名字的 
  int year, mon, day;   // 用来装年月日的 
  int n, cnt = 0, flag = 0;    
  long long bm = 20140906, bi = 18140906, temp, m1 = 0, m2 = 0;  // 看到这里就知道这个原理了,就是把出生日期转化为数字来对比,一定要用long long 不然可能数据溢出 
  scanf ("%d", &n);  // 待处理的数据个数 
  for (int i = 0; i < n; i++)
  {
    scanf ("%s %d/%d/%d", name, &year, &mon, &day); // 输入年月日 
    temp = year * 10000 + mon * 100 + day;  // 进行格式转换 
    if (temp >= bi && temp <= bm) // 简单的判断看看是否在要求的界限范围内 
    {
      cnt++;
      if (flag == 0)        // 标记用的,最大,最小都用第一个初始化 
      {
        m1= temp;
        strcpy(max, name);
        m2 = temp;
        strcpy(min, name);
        flag = 1;
      }
      else
      {
        if (temp > m1)   // 这里就是很常见的找最大,最小的判断了 
        {
          m1 = temp;
          strcpy(max, name);
        }
        if (temp < m2)
        {
          m2 = temp;
          strcpy(min, name);
        }
      }
    }
  }
  cout << cnt << " " << min << " " << max << endl;
  return 0;
}
相关文章
|
Java 测试技术 程序员
|
机器学习/深度学习 算法 数据库
KNN和SVM实现对LFW人像图像数据集的分类应用
KNN和SVM实现对LFW人像图像数据集的分类应用
335 0
|
数据安全/隐私保护 Windows
Windows 技术篇 - 远程桌面连接不保存密码、每次都要输入密码问题解决
Windows 技术篇 - 远程桌面连接不保存密码、每次都要输入密码问题解决
2707 0
Windows 技术篇 - 远程桌面连接不保存密码、每次都要输入密码问题解决
|
2月前
|
IDE 安全 Java
Lombok 在企业级 Java 项目中的隐性成本:便利背后的取舍之道
Lombok虽能简化Java代码,但其“魔法”特性易破坏封装、影响可维护性,隐藏调试难题,且与JPA等框架存在兼容风险。企业级项目应优先考虑IDE生成、Java Records或MapStruct等更透明、稳健的替代方案,平衡开发效率与系统长期稳定性。
174 1
|
3月前
|
存储 固态存储 IDE
移动硬盘盒,机械硬盘和固态硬盘通用吗?
移动硬盘盒能否同时支持机械硬盘(HDD)和固态硬盘(SSD)?本文详解硬盘盒的兼容性问题,涵盖接口类型(如SATA、NVMe)、尺寸规格(2.5英寸、3.5英寸、M.2)及使用体验差异,助你正确选择适配的硬盘盒,确保兼容与性能兼顾。
|
6月前
|
算法 Java 调度
Java多线程基础
本文主要讲解多线程相关知识,分为两部分。第一部分涵盖多线程概念(并发与并行、进程与线程)、Java程序运行原理(JVM启动多线程特性)、实现多线程的两种方式(继承Thread类与实现Runnable接口)及其区别。第二部分涉及线程同步(同步锁的应用场景与代码示例)及线程间通信(wait()与notify()方法的使用)。通过多个Demo代码实例,深入浅出地解析多线程的核心知识点,帮助读者掌握其实现与应用技巧。
131 1
|
7月前
|
设计模式 机器学习/深度学习 缓存
基于PySide6的聚合翻译软件设计与实现
本项目基于PySide6框架构建多引擎聚合智能翻译系统,解决传统工具单一API依赖、切换繁琐及定制化不足的问题。系统采用分层架构,包含UI层、业务逻辑层和API层,运用策略模式、工厂模式等设计模式提升灵活性。核心功能包括翻译引擎抽象、智能路由选择与异步处理,支持无感切换、动态权重调整及非阻塞交互。优化策略涵盖LRU缓存与三级容错机制,确保高性能与稳定性。系统跨平台发布,具备插件化扩展能力,未来将探索机器学习质量预估与OCR支持等功能,适配企业级需求。
208 11
|
安全 大数据 5G
运营商在安全领域的优势分析
近年来,中美贸易摩擦加剧,国际争端凸显,国家高度重视网络安全的建设,网络安全已上升及国家战略层面,网络空间作为“第五疆域”受到极大重视。个人与企业对于网络安全的需求不断增加,中国网络安全市场也随之发展。
412 0
|
机器学习/深度学习 数据挖掘 定位技术
预测未来:Python 数据挖掘案例
数据挖掘是从大量数据中提取有用信息的过程。通过应用数据挖掘技术,我们可以发现数据中的模式、关系和趋势,从而做出预测和决策。在 Python 中,有许多强大的数据挖掘库和工具可供使用。本文将介绍一个使用 Python 进行数据挖掘以预测未来的案例。
|
存储 算法 索引
如何实现文件增量同步——算法
问题: 如何增量同步文件,例如一个文本文件有10M,分别存放在A,B两个地方,现在两个文件是完全一样的,但是我马上要在A上对这个文件进行修改,B如何实现自动和A上的文件保持一致,并且网络的传输量最少。
1610 0