OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4862|回复: 2

时间计算算法:可涉及到加密解密

[复制链接]

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2099
金钱
2099
注册时间
2017-2-11
在线时间
306 小时
发表于 2021-4-27 08:51:35 | 显示全部楼层 |阅读模式
  简单分析下面两个实际项目中用到的算法:
  1.输入当前年,月,日和周期天数,计算预期的年,月,日

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. /* run this program using the console pauser or add your own getch, system("pause") or input loop */

  4. void get_data(int start_year, int start_month, int start_day, int days);

  5. struct GTE_NEWDATA
  6. {
  7. int year;         //定义天
  8. int month;         //定义月
  9. int day;         //定义天
  10. };
  11. struct GTE_NEWDATA get_newdata;

  12. int main(int argc, char *argv[])
  13. {
  14.         int year , mon , day , daycnt;
  15.         while(1)
  16.         {
  17.                 printf("input year/mouth/day/daycnt:");
  18.                 scanf("%d/%d/%d/%d" , &year , &mon , &day ,&daycnt);
  19.                
  20.                 get_data(year,mon,day,daycnt);       
  21.                 printf("new day:%d/%d/%d\n" , get_newdata.year , get_newdata.month , get_newdata.day );
  22.         }
  23.         return 0;
  24. }

  25. void get_data(int uiyear, int uimonth, int uiday, int uidaycnt)
  26. {
  27.         static int days[]={31,28,31,30,31,30,31,31,30,31,30,31};

  28.        
  29.         //请确保输入的数据是有效的日期,不然出错
  30.         //根据年份确定当年是否闰年
  31.         if ( (uiyear%4==0 && uiyear %100) || uiyear %400==0 )
  32.                 days[1]=29; //闰年二月29
  33.         else
  34.                 days[1]=28;//平年二月28
  35.                
  36.         //目前只支持正数
  37.         uiday += uidaycnt;
  38.         while ( uiday > days[uimonth-1] ) //天数超过当前月最大天数,要过月
  39.         {
  40.                 uiday -= days[uimonth-1] ;
  41.                 uimonth += 1 ;
  42.                 get_newdata.month = uimonth;
  43.                 if ( uimonth > 12 ) //月满则变年
  44.                 {
  45.                         uimonth = 1;
  46.                         uiyear += 1 ; //年变后,要重新确认下一年是否闰年
  47.                         if ( (uiyear%4==0 && uiyear %100) || uiyear %400==0 )
  48.                                 days[1]=29;
  49.                         else
  50.                                 days[1]=28;
  51.                 }
  52.         }
  53.        
  54.         get_newdata.day = uiday;
  55.         get_newdata.month = uimonth;
  56.         get_newdata.year = uiyear;
  57. }
复制代码
得到的结果如下:   企业微信截图_20210427084720.png
  2.已知当前年、月、日和未来的年、月、日,计算两者之间的天数

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. /*******************************
  4. *Function: 计算任意日期间的天数
  5. *int start_year,start_month, start_day: 开始年,月,日
  6. *int end_year, end_month, end_day: 结束年,月,日
  7. *return: 计算的结果
  8. */
  9. double Count_day(int start_year, int start_month, int start_day, int end_year, int end_month, int end_day);

  10. /* run this program using the console pauser or add your own getch, system("pause") or input loop */

  11. int main(int argc, char *argv[])
  12. {
  13.         char name[20];  //定义字符串数组
  14.         double ret;     //定义接受函数返回值的边量
  15.         int start_year, start_month, start_day;     //定义开始的年份,月份,天数变量
  16.         int end_year, end_month, end_day;           //定义结束的年份,月份,天数变量
  17.         while(1)        //循环输入判断
  18.         {
  19.                 printf("请输入您的姓名:___\b\b\b");
  20.                 scanf("%s", name);
  21.                 printf("欢迎%s来到地球探险\n", name);
  22.                 printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
  23.                 printf("请输入你的生日时间(年-月-日):\n");
  24.                 scanf("%d-%d-%d", &start_year, &start_month, &start_day);
  25.                 printf("请输入你要查询的最后时间(年-月-日):\n");
  26.                 scanf("%d-%d-%d", &end_year, &end_month, &end_day);
  27.                 printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
  28.                 ret = Count_day(start_year, start_month, start_day, end_year, end_month, end_day);  //调用日期函数
  29.                 printf("非常庆幸,您已经在地球上存活了%.0f天\n", ret);
  30.                 printf("欢迎您来到地球探险!\n");
  31.                 printf("\n");
  32.         }
  33.         return 0;
  34. }

  35. /*******************************
  36. *Function: 计算任意日期间的天数
  37. *int start_year,start_month, start_day: 开始年,月,日
  38. *int end_year, end_month, end_day: 结束年,月,日
  39. *return: 计算的结果
  40. */
  41. double Count_day(int start_year, int start_month, int start_day, int end_year, int end_month, int end_day)
  42. {
  43.     //定义月份包含的天数一维数组
  44.     int day[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
  45.     int i;                  //定义循环变量
  46.     double sum_day = 0;     //定义总的天数,并初始化为0
  47.     int count_lyear = 0;    //定义总的闰年数,并初始化为0
  48.     int count_cyear = 0;    //定义总的平年数,并初始化为0
  49.     int count_sday = 0;     //定义开始年的天数,并初始化为0
  50.     int count_eday = 0;     //定义结束年的天数,并初始化为0

  51.     for(i = start_year + 1; i < end_year; i++)  //记录整的闰年数和平年数
  52.     {
  53.         if(((i % 4) == 0 && (i % 100) != 0) || (i % 400) == 0)
  54.         {
  55.             count_lyear++;  //闰年总数增加
  56.         }else{
  57.             count_cyear++;  //平年总数增加
  58.         }
  59.     }
  60.     if(start_year == end_year)  //当两年分相同时
  61.     {
  62.         //判断是不是闰年,是闰年则将day[1]初始化为29,否则为28
  63.         day[1] = (((start_year % 4) == 0 && (start_year % 100) != 0) || (start_year % 400) == 0) ? 29 : 28;
  64.         for(i = start_month; i < end_month; i++)    //循环记录开始月份到结束月份的天数
  65.         {
  66.             sum_day += day[start_month - 1];
  67.         }
  68.         sum_day = sum_day - start_day + end_day;    //计算总天数,减去开始月的天数,加上最后一个月的天数
  69.     }else{
  70.         while(start_month <= 12)    //循环记录开始年的天数
  71.         {
  72.             day[1] = (((start_year % 4) == 0 && (start_year % 100) != 0) || (start_year % 400) == 0) ? 29 : 28;
  73.             count_sday += day[start_month - 1];
  74.             start_month++;
  75.         }
  76.         count_sday -= start_day;    //减去开始月份包含的天数

  77.         int month = 1;              //定义结束年份起始的月份,初始化为1

  78.         while(month < end_month)    //循环记录结束年份中结束月份之前的天数
  79.         {
  80.             day[1] = (((end_year % 4) == 0 && (end_year % 100) != 0) || (end_year % 400) == 0) ? 29 : 28;
  81.             count_eday += day[month - 1];
  82.             month++;
  83.         }
  84.         count_eday += end_day;      //加上结束月份包含的天数
  85.         //计算总天数
  86.         sum_day += (count_lyear * 366) + (count_cyear * 365) + count_sday + count_eday;
  87.     }

  88.     return sum_day;
  89. }
复制代码
计算的结果如下:   222.png
  伸手党记得点赞哦!~@@~
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

13

主题

644

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1976
金钱
1976
注册时间
2021-4-16
在线时间
505 小时
发表于 2021-4-27 11:36:45 | 显示全部楼层
回复 支持 反对

使用道具 举报

13

主题

643

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2432
金钱
2432
注册时间
2019-12-28
在线时间
527 小时
发表于 2021-4-27 14:59:54 | 显示全部楼层
谢谢楼主的分享
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-28 00:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表