刷题笔记|计算两个年份间某一日期是周末的天数,发现ctime库对象有时间范围(C++|Python )

简介: 刷题笔记|计算两个年份间某一日期是周末的天数,发现ctime库对象有时间范围(C++|Python )

8cb0b033d88bd9aed88021da1ff1d040.png


——题目来源于问答频道的网友提问



C++版本

#include <iostream>
using namespace std;
int daysinyear(int year)
{
  return 365 + ((year%4==0 && year%100!=0) || year%400==0);
}
int count(int year1,int year2)
{
  int t, total = 0;
  int weekday[3000-1900+1];
  weekday[0] = 7;
  for (int i=1901;i<=3000;i++){
    t = daysinyear(i) + weekday[i-1900 - 1] - 1;
    weekday[i-1900] = t % 7 + 1;
  } 
  for (int i=year1;i<=year2;i++){
    if (weekday[i-1900]==6 || weekday[i-1900]==7){
      total++;
    }
  }
  return total;
}
int main ()
{
  int y1,y2;
  cin >> y1 >> y2;
  cout << count(y1,y2) << endl;
    return 0;
}



稍作修改,可以输出所有满足条件的年份:

#include <iostream>
using namespace std;
int daysinyear(int year)
{
  return 365 + ((year%4==0 && year%100!=0) || year%400==0);
}
void count(int year1,int year2)
{
  int t, total=0;
  int weekday[3000-1900+1];
  int years[3000-1900+1];
  weekday[0] = 7;
  for (int i=1901;i<=3000;i++){
    t = daysinyear(i) + weekday[i-1900 - 1] - 1;
    weekday[i-1900] = t % 7 + 1;
  }
  t = 0;
  for (int i=year1;i<=year2;i++){
    if (weekday[i-1900]==6 || weekday[i-1900]==7){
      total++;
      years[t++] = i;
    }
  }
  cout << year1 << "年到" << year2 << "年间符合要求的年份共有" ;
  cout << total << "个:" << endl; 
  for (int i=0;i<total;i++){
    cout << years[i] << " ";
    if (i%10==9) cout << endl;
  }
  cout << endl;
}
int main ()
{
  count(1900,3000);
  count(2018,2100);
    return 0;
}


输出内容:  


1900年到3000年间符合要求的年份共有314个:


1900 1905 1906 1911 1916 1917 1922 1923 1928 1933

1934 1939 1944 1945 1950 1951 1956 1961 1962 1967

1972 1973 1978 1979 1984 1989 1990 1995 2000 2001

2006 2007 2012 2017 2018 2023 2028 2029 2034 2035

2040 2045 2046 2051 2056 2057 2062 2063 2068 2073

2074 2079 2084 2085 2090 2091 2096 2102 2103 2108

2113 2114 2119 2124 2125 2130 2131 2136 2141 2142

2147 2152 2153 2158 2159 2164 2169 2170 2175 2180

2181 2186 2187 2192 2197 2198 2204 2209 2210 2215

2220 2221 2226 2227 2232 2237 2238 2243 2248 2249

2254 2255 2260 2265 2266 2271 2276 2277 2282 2283

2288 2293 2294 2299 2300 2305 2306 2311 2316 2317

2322 2323 2328 2333 2334 2339 2344 2345 2350 2351

2356 2361 2362 2367 2372 2373 2378 2379 2384 2389

2390 2395 2400 2401 2406 2407 2412 2417 2418 2423

2428 2429 2434 2435 2440 2445 2446 2451 2456 2457

2462 2463 2468 2473 2474 2479 2484 2485 2490 2491

2496 2502 2503 2508 2513 2514 2519 2524 2525 2530

2531 2536 2541 2542 2547 2552 2553 2558 2559 2564

2569 2570 2575 2580 2581 2586 2587 2592 2597 2598

2604 2609 2610 2615 2620 2621 2626 2627 2632 2637

2638 2643 2648 2649 2654 2655 2660 2665 2666 2671

2676 2677 2682 2683 2688 2693 2694 2699 2700 2705

2706 2711 2716 2717 2722 2723 2728 2733 2734 2739

2744 2745 2750 2751 2756 2761 2762 2767 2772 2773

2778 2779 2784 2789 2790 2795 2800 2801 2806 2807

2812 2817 2818 2823 2828 2829 2834 2835 2840 2845

2846 2851 2856 2857 2862 2863 2868 2873 2874 2879

2884 2885 2890 2891 2896 2902 2903 2908 2913 2914

2919 2924 2925 2930 2931 2936 2941 2942 2947 2952

2953 2958 2959 2964 2969 2970 2975 2980 2981 2986

2987 2992 2997 2998



2018年到2100年间符合要求的年份共有23个:

2018 2023 2028 2029 2034 2035 2040 2045 2046 2051

2056 2057 2062 2063 2068 2073 2074 2079 2084 2085

2090 2091 2096

--------------------------------


Process exited after 1.623 seconds with return value 0

请按任意键继续. . .

原本想用<ctime>库来验证:

#include <iostream>
#include <ctime>
using namespace std;
int main ()
{
  time_t ltm;
  struct tm *info;
  time(&ltm); 
    info = localtime(&ltm);
  for (int year = 1970; year<2038; year++){
      info->tm_year = year - 1900;
      info->tm_mon  = 11 - 1;
      info->tm_mday = 11;
      mktime(info); 
      if ((info->tm_wday)==0 || (info->tm_wday)==6)
        cout << year <<endl;    
   }
    return 0;
}
/*
1972
1973
1978
1979
1984
1989
1990
1995
2000
2001
2006
2007
2012
2017
2018
2023
2028
2029
2034
2035
*/



后来发现只能正确输出这一段年份,百度了一下,原来它的CTime对象是有指定范围的:


   static CTime WINAPI GetCurrentTime( );

   获取系统当前日期和时间。返回表示当前日期和时间的CTime对象。

   int GetYear( ) const;

   获取CTime对象表示时间的年份。范围从1970年1月1日到2038年(包括2038年)1月18日。




python版本


python的日期时间库没有限制:

import datetime as dt
years = []
for i in range(1900,3001):
    if dt.date(i,11,11).weekday() in [5,6]:
        years.append(i)
m,n = map(int,input('请输入两个年份(1900~3000)').split())
total = list(filter(lambda x:m<=x<=n, years))
print(len(total),'\n满足条件的所有年份:\n',years)


还是python简洁,几行代码就能解决问题。

目录
相关文章
|
2天前
|
XML JSON 数据库
Python的标准库
Python的标准库
110 77
|
1月前
|
调度 开发者 Python
Python中的异步编程:理解asyncio库
在Python的世界里,异步编程是一种高效处理I/O密集型任务的方法。本文将深入探讨Python的asyncio库,它是实现异步编程的核心。我们将从asyncio的基本概念出发,逐步解析事件循环、协程、任务和期货的概念,并通过实例展示如何使用asyncio来编写异步代码。不同于传统的同步编程,异步编程能够让程序在等待I/O操作完成时释放资源去处理其他任务,从而提高程序的整体效率和响应速度。
|
1月前
|
数据采集 存储 数据挖掘
Python数据分析:Pandas库的高效数据处理技巧
【10月更文挑战第27天】在数据分析领域,Python的Pandas库因其强大的数据处理能力而备受青睐。本文介绍了Pandas在数据导入、清洗、转换、聚合、时间序列分析和数据合并等方面的高效技巧,帮助数据分析师快速处理复杂数据集,提高工作效率。
69 0
|
17天前
|
机器学习/深度学习 算法 数据挖掘
数据分析的 10 个最佳 Python 库
数据分析的 10 个最佳 Python 库
52 4
数据分析的 10 个最佳 Python 库
|
3天前
|
XML JSON 数据库
Python的标准库
Python的标准库
27 11
|
16天前
|
人工智能 API 开发工具
aisuite:吴恩达发布开源Python库,一个接口调用多个大模型
吴恩达发布的开源Python库aisuite,提供了一个统一的接口来调用多个大型语言模型(LLM)服务。支持包括OpenAI、Anthropic、Azure等在内的11个模型平台,简化了多模型管理和测试的工作,促进了人工智能技术的应用和发展。
69 1
aisuite:吴恩达发布开源Python库,一个接口调用多个大模型
|
3天前
|
数据可视化 Python
以下是一些常用的图表类型及其Python代码示例,使用Matplotlib和Seaborn库。
通过这些思维导图和分析说明表,您可以更直观地理解和选择适合的数据可视化图表类型,帮助更有效地展示和分析数据。
31 8
|
24天前
|
XML 存储 数据库
Python中的xmltodict库
xmltodict是Python中用于处理XML数据的强大库,可将XML数据与Python字典相互转换,适用于Web服务、配置文件读取及数据转换等场景。通过`parse`和`unparse`函数,轻松实现XML与字典间的转换,支持复杂结构和属性处理,并能有效管理错误。此外,还提供了实战案例,展示如何从XML配置文件中读取数据库连接信息并使用。
Python中的xmltodict库
|
24天前
|
存储 人工智能 搜索推荐
Memoripy:支持 AI 应用上下文感知的记忆管理 Python 库
Memoripy 是一个 Python 库,用于管理 AI 应用中的上下文感知记忆,支持短期和长期存储,兼容 OpenAI 和 Ollama API。
80 6
Memoripy:支持 AI 应用上下文感知的记忆管理 Python 库
|
11天前
|
安全 API 文件存储
Yagmail邮件发送库:如何用Python实现自动化邮件营销?
本文详细介绍了如何使用Yagmail库实现自动化邮件营销。Yagmail是一个简洁强大的Python库,能简化邮件发送流程,支持文本、HTML邮件及附件发送,适用于数字营销场景。文章涵盖了Yagmail的基本使用、高级功能、案例分析及最佳实践,帮助读者轻松上手。
22 4