刷题笔记|计算两个年份间某一日期是周末的天数,发现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简洁,几行代码就能解决问题。

目录
相关文章
|
4天前
|
调度 开发者 Python
Python中的异步编程:理解asyncio库
在Python的世界里,异步编程是一种高效处理I/O密集型任务的方法。本文将深入探讨Python的asyncio库,它是实现异步编程的核心。我们将从asyncio的基本概念出发,逐步解析事件循环、协程、任务和期货的概念,并通过实例展示如何使用asyncio来编写异步代码。不同于传统的同步编程,异步编程能够让程序在等待I/O操作完成时释放资源去处理其他任务,从而提高程序的整体效率和响应速度。
|
7天前
|
数据采集 存储 数据挖掘
Python数据分析:Pandas库的高效数据处理技巧
【10月更文挑战第27天】在数据分析领域,Python的Pandas库因其强大的数据处理能力而备受青睐。本文介绍了Pandas在数据导入、清洗、转换、聚合、时间序列分析和数据合并等方面的高效技巧,帮助数据分析师快速处理复杂数据集,提高工作效率。
27 0
|
6天前
|
数据采集 JSON 测试技术
Python爬虫神器requests库的使用
在现代编程中,网络请求是必不可少的部分。本文详细介绍 Python 的 requests 库,一个功能强大且易用的 HTTP 请求库。内容涵盖安装、基本功能(如发送 GET 和 POST 请求、设置请求头、处理响应)、高级功能(如会话管理和文件上传)以及实际应用场景。通过本文,你将全面掌握 requests 库的使用方法。🚀🌟
27 7
|
22天前
|
网络协议 数据库连接 Python
python知识点100篇系列(17)-替换requests的python库httpx
【10月更文挑战第4天】Requests 是基于 Python 开发的 HTTP 库,使用简单,功能强大。然而,随着 Python 3.6 的发布,出现了 Requests 的替代品 —— httpx。httpx 继承了 Requests 的所有特性,并增加了对异步请求的支持,支持 HTTP/1.1 和 HTTP/2,能够发送同步和异步请求,适用于 WSGI 和 ASGI 应用。安装使用 httpx 需要 Python 3.6 及以上版本,异步请求则需要 Python 3.8 及以上。httpx 提供了 Client 和 AsyncClient,分别用于优化同步和异步请求的性能。
python知识点100篇系列(17)-替换requests的python库httpx
|
7天前
|
机器学习/深度学习 数据采集 算法
Python机器学习:Scikit-learn库的高效使用技巧
【10月更文挑战第28天】Scikit-learn 是 Python 中最受欢迎的机器学习库之一,以其简洁的 API、丰富的算法和良好的文档支持而受到开发者喜爱。本文介绍了 Scikit-learn 的高效使用技巧,包括数据预处理(如使用 Pipeline 和 ColumnTransformer)、模型选择与评估(如交叉验证和 GridSearchCV)以及模型持久化(如使用 joblib)。通过这些技巧,你可以在机器学习项目中事半功倍。
18 3
|
10天前
|
数据采集 数据可视化 数据处理
如何使用Python实现一个交易策略。主要步骤包括:导入所需库(如`pandas`、`numpy`、`matplotlib`)
本文介绍了如何使用Python实现一个交易策略。主要步骤包括:导入所需库(如`pandas`、`numpy`、`matplotlib`),加载历史数据,计算均线和其他技术指标,实现交易逻辑,记录和可视化交易结果。示例代码展示了如何根据均线交叉和价格条件进行开仓、止损和止盈操作。实际应用时需注意数据质量、交易成本和风险管理。
29 5
|
8天前
|
存储 数据挖掘 数据处理
Python数据分析:Pandas库的高效数据处理技巧
【10月更文挑战第26天】Python 是数据分析领域的热门语言,Pandas 库以其高效的数据处理功能成为数据科学家的利器。本文介绍 Pandas 在数据读取、筛选、分组、转换和合并等方面的高效技巧,并通过示例代码展示其实际应用。
20 1
|
18天前
|
数据可视化 数据挖掘 Python
Seaborn 库创建吸引人的统计图表
【10月更文挑战第11天】本文介绍了如何使用 Seaborn 库创建多种统计图表,包括散点图、箱线图、直方图、线性回归图、热力图等。通过具体示例和代码,展示了 Seaborn 在数据可视化中的强大功能和灵活性,帮助读者更好地理解和应用这一工具。
31 3
|
6天前
|
文字识别 自然语言处理 API
Python中的文字识别利器:pytesseract库
`pytesseract` 是一个基于 Google Tesseract-OCR 引擎的 Python 库,能够从图像中提取文字,支持多种语言,易于使用且兼容性强。本文介绍了 `pytesseract` 的安装、基本功能、高级特性和实际应用场景,帮助读者快速掌握 OCR 技术。
27 0
|
23天前
|
Linux Android开发 开发者
【Python】GUI:Kivy库环境安装与示例
这篇文章介绍了 Kivy 库的安装与使用示例。Kivy 是一个开源的 Python 库,支持多平台开发,适用于多点触控应用。文章详细说明了 Kivy 的主要特点、环境安装方法,并提供了两个示例:一个简单的 Hello World 应用和一个 BMI 计算器界面。
36 0