POJ 3393 大模拟

定义:

Goog month : 该月第一个工作日为星期一的月份

Luckly month: 该月最后一个工作日为星期五的月份

问: 给定一个Gregorian Calendar格里高公历的 时间闭区间(就是包括端点的年月了)

【开始年、月】~【结束年、月】

     在这个时间区间内,有多少个Goog month,有多少个Luckly month

 

文章要点:

Gregorian Calendar格里高公历 就是现在广泛使用公历(西历),下面简称GC

GC的起始日期为 1年1月1号,该日为星期六

GC平年有365天,闰年366天(2月多1天)

GC有12个月,各月的天数和现在的使用的西历一致

GC在1582年之前(不包括1582),若该年份能被4整除,则为闰年

GC在1582年之后(包括1582),判断闰年的标准(满足下面随便一个):

(1) 能被4整除,但不能被100整除;

(2) 能被400整除。

由于历史原因,GC规定1700年无条件为闰年

由于历史原因,GC规定1752年9月3日~13日共11天不存在,即1752年9月只有19天

GC一星期有7天,排序为Sun,Mon,Tue,Wed,Thu,Fri,Sat,和现在的星期一致,其中Mon到Fri为工作日,Sun和Sat为休息日
以上内容摘自
原文:https://blog.csdn.net/lyy289065406/article/details/6648634 

个人做法:

因为1752年以前是特殊的,所以打表处理,然后以后的日期就可以用 基姆拉尔森计算公式根据日期判断星期几

 

即:

void CalculateWeekDay(int y, int m,int d){
	if(m==1||m==2) m+=12,y--;
	int iWeek = (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;
	switch(iWeek){
		case 0: printf("星期一\n"); break;
     	case 1: printf("星期二\n"); break;
     	case 2: printf("星期三\n"); break;
     	case 3: printf("星期四\n"); break;
     	case 4: printf("星期五\n"); break;
     	case 5: printf("星期六\n"); break;
     	case 6: printf("星期日\n"); break;
	}
}
int main()
{
	CalculateWeekDay(2015,9,17);
	return 0;
}

代码如下:

#include<bits/stdc++.h>
using namespace std;
int month_ping[]={0,31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int month_run []={0,31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int year_day[]={0,365, 730, 1095, 1461, 1826, 2191, 2556, 2922, 3287, 3652, 4017, 4383, 4748, 5113, 5478, 5844, 6209, 6574, 6939, 7305, 7670, 8035, 8400, 8766, 9131, 9496, 9861, 10227, 10592, 10957, 11322, 11688, 12053, 12418, 12783, 13149, 13514, 13879, 14244, 14610, 14975, 15340, 15705, 16071, 16436, 16801, 17166, 17532, 17897, 18262, 18627, 18993, 19358, 19723, 20088, 20454, 20819, 21184, 21549, 21915, 22280, 22645, 23010, 23376, 23741, 24106, 24471, 24837, 25202, 25567, 25932, 26298, 26663, 27028, 27393, 27759, 28124, 28489, 28854, 29220, 29585, 29950, 30315, 30681, 31046, 31411, 31776, 32142, 32507, 32872, 33237, 33603, 33968, 34333, 34698, 35064, 35429, 35794, 36159, 36525, 36890, 37255, 37620, 37986, 38351, 38716, 39081, 39447, 39812, 40177, 40542, 40908, 41273, 41638, 42003, 42369, 42734, 43099, 43464, 43830, 44195, 44560, 44925, 45291, 45656, 46021, 46386, 46752, 47117, 47482, 47847, 48213, 48578, 48943, 49308, 49674, 50039, 50404, 50769, 51135, 51500, 51865, 52230, 52596, 52961, 53326, 53691, 54057, 54422, 54787, 55152, 55518, 55883, 56248, 56613, 56979, 57344, 57709, 58074, 58440, 58805, 59170, 59535, 59901, 60266, 60631, 60996, 61362, 61727, 62092, 62457, 62823, 63188, 63553, 63918, 64284, 64649, 65014, 65379, 65745, 66110, 66475, 66840, 67206, 67571, 67936, 68301, 68667, 69032, 69397, 69762, 70128, 70493, 70858, 71223, 71589, 71954, 72319, 72684, 73050, 73415, 73780, 74145, 74511, 74876, 75241, 75606, 75972, 76337, 76702, 77067, 77433, 77798, 78163, 78528, 78894, 79259, 79624, 79989, 80355, 80720, 81085, 81450, 81816, 82181, 82546, 82911, 83277, 83642, 84007, 84372, 84738, 85103, 85468, 85833, 86199, 86564, 86929, 87294, 87660, 88025, 88390, 88755, 89121, 89486, 89851, 90216, 90582, 90947, 91312, 91677, 92043, 92408, 92773, 93138, 93504, 93869, 94234, 94599, 94965, 95330, 95695, 96060, 96426, 96791, 97156, 97521, 97887, 98252, 98617, 98982, 99348, 99713, 100078, 100443, 100809, 101174, 101539, 101904, 102270, 102635, 103000, 103365, 103731, 104096, 104461, 104826, 105192, 105557, 105922, 106287, 106653, 107018, 107383, 107748, 108114, 108479, 108844, 109209, 109575, 109940, 110305, 110670, 111036, 111401, 111766, 112131, 112497, 112862, 113227, 113592, 113958, 114323, 114688, 115053, 115419, 115784, 116149, 116514, 116880, 117245, 117610, 117975, 118341, 118706, 119071, 119436, 119802, 120167, 120532, 120897, 121263, 121628, 121993, 122358, 122724, 123089, 123454, 123819, 124185, 124550, 124915, 125280, 125646, 126011, 126376, 126741, 127107, 127472, 127837, 128202, 128568, 128933, 129298, 129663, 130029, 130394, 130759, 131124, 131490, 131855, 132220, 132585, 132951, 133316, 133681, 134046, 134412, 134777, 135142, 135507, 135873, 136238, 136603, 136968, 137334, 137699, 138064, 138429, 138795, 139160, 139525, 139890, 140256, 140621, 140986, 141351, 141717, 142082, 142447, 142812, 143178, 143543, 143908, 144273, 144639, 145004, 145369, 145734, 146100, 146465, 146830, 147195, 147561, 147926, 148291, 148656, 149022, 149387, 149752, 150117, 150483, 150848, 151213, 151578, 151944, 152309, 152674, 153039, 153405, 153770, 154135, 154500, 154866, 155231, 155596, 155961, 156327, 156692, 157057, 157422, 157788, 158153, 158518, 158883, 159249, 159614, 159979, 160344, 160710, 161075, 161440, 161805, 162171, 162536, 162901, 163266, 163632, 163997, 164362, 164727, 165093, 165458, 165823, 166188, 166554, 166919, 167284, 167649, 168015, 168380, 168745, 169110, 169476, 169841, 170206, 170571, 170937, 171302, 171667, 172032, 172398, 172763, 173128, 173493, 173859, 174224, 174589, 174954, 175320, 175685, 176050, 176415, 176781, 177146, 177511, 177876, 178242, 178607, 178972, 179337, 179703, 180068, 180433, 180798, 181164, 181529, 181894, 182259, 182625, 182990, 183355, 183720, 184086, 184451, 184816, 185181, 185547, 185912, 186277, 186642, 187008, 187373, 187738, 188103, 188469, 188834, 189199, 189564, 189930, 190295, 190660, 191025, 191391, 191756, 192121, 192486, 192852, 193217, 193582, 193947, 194313, 194678, 195043, 195408, 195774, 196139, 196504, 196869, 197235, 197600, 197965, 198330, 198696, 199061, 199426, 199791, 200157, 200522, 200887, 201252, 201618, 201983, 202348, 202713, 203079, 203444, 203809, 204174, 204540, 204905, 205270, 205635, 206001, 206366, 206731, 207096, 207462, 207827, 208192, 208557, 208923, 209288, 209653, 210018, 210384, 210749, 211114, 211479, 211845, 212210, 212575, 212940, 213306, 213671, 214036, 214401, 214767, 215132, 215497, 215862, 216228, 216593, 216958, 217323, 217689, 218054, 218419, 218784, 219150, 219515, 219880, 220245, 220611, 220976, 221341, 221706, 222072, 222437, 222802, 223167, 223533, 223898, 224263, 224628, 224994, 225359, 225724, 226089, 226455, 226820, 227185, 227550, 227916, 228281, 228646, 229011, 229377, 229742, 230107, 230472, 230838, 231203, 231568, 231933, 232299, 232664, 233029, 233394, 233760, 234125, 234490, 234855, 235221, 235586, 235951, 236316, 236682, 237047, 237412, 237777, 238143, 238508, 238873, 239238, 239604, 239969, 240334, 240699, 241065, 241430, 241795, 242160, 242526, 242891, 243256, 243621, 243987, 244352, 244717, 245082, 245448, 245813, 246178, 246543, 246909, 247274, 247639, 248004, 248370, 248735, 249100, 249465, 249831, 250196, 250561, 250926, 251292, 251657, 252022, 252387, 252753, 253118, 253483, 253848, 254214, 254579, 254944, 255309, 255675, 256040, 256405, 256770, 257136, 257501, 257866, 258231, 258597, 258962, 259327, 259692, 260058, 260423, 260788, 261153, 261519, 261884, 262249, 262614, 262980, 263345, 263710, 264075, 264441, 264806, 265171, 265536, 265902, 266267, 266632, 266997, 267363, 267728, 268093, 268458, 268824, 269189, 269554, 269919, 270285, 270650, 271015, 271380, 271746, 272111, 272476, 272841, 273207, 273572, 273937, 274302, 274668, 275033, 275398, 275763, 276129, 276494, 276859, 277224, 277590, 277955, 278320, 278685, 279051, 279416, 279781, 280146, 280512, 280877, 281242, 281607, 281973, 282338, 282703, 283068, 283434, 283799, 284164, 284529, 284895, 285260, 285625, 285990, 286356, 286721, 287086, 287451, 287817, 288182, 288547, 288912, 289278, 289643, 290008, 290373, 290739, 291104, 291469, 291834, 292200, 292565, 292930, 293295, 293661, 294026, 294391, 294756, 295122, 295487, 295852, 296217, 296583, 296948, 297313, 297678, 298044, 298409, 298774, 299139, 299505, 299870, 300235, 300600, 300966, 301331, 301696, 302061, 302427, 302792, 303157, 303522, 303888, 304253, 304618, 304983, 305349, 305714, 306079, 306444, 306810, 307175, 307540, 307905, 308271, 308636, 309001, 309366, 309732, 310097, 310462, 310827, 311193, 311558, 311923, 312288, 312654, 313019, 313384, 313749, 314115, 314480, 314845, 315210, 315576, 315941, 316306, 316671, 317037, 317402, 317767, 318132, 318498, 318863, 319228, 319593, 319959, 320324, 320689, 321054, 321420, 321785, 322150, 322515, 322881, 323246, 323611, 323976, 324342, 324707, 325072, 325437, 325803, 326168, 326533, 326898, 327264, 327629, 327994, 328359, 328725, 329090, 329455, 329820, 330186, 330551, 330916, 331281, 331647, 332012, 332377, 332742, 333108, 333473, 333838, 334203, 334569, 334934, 335299, 335664, 336030, 336395, 336760, 337125, 337491, 337856, 338221, 338586, 338952, 339317, 339682, 340047, 340413, 340778, 341143, 341508, 341874, 342239, 342604, 342969, 343335, 343700, 344065, 344430, 344796, 345161, 345526, 345891, 346257, 346622, 346987, 347352, 347718, 348083, 348448, 348813, 349179, 349544, 349909, 350274, 350640, 351005, 351370, 351735, 352101, 352466, 352831, 353196, 353562, 353927, 354292, 354657, 355023, 355388, 355753, 356118, 356484, 356849, 357214, 357579, 357945, 358310, 358675, 359040, 359406, 359771, 360136, 360501, 360867, 361232, 361597, 361962, 362328, 362693, 363058, 363423, 363789, 364154, 364519, 364884, 365250, 365615, 365980, 366345, 366711, 367076, 367441, 367806, 368172, 368537, 368902, 369267, 369633, 369998, 370363, 370728, 371094, 371459, 371824, 372189, 372555, 372920, 373285, 373650, 374016, 374381, 374746, 375111, 375477, 375842, 376207, 376572, 376938, 377303, 377668, 378033, 378399, 378764, 379129, 379494, 379860, 380225, 380590, 380955, 381321, 381686, 382051, 382416, 382782, 383147, 383512, 383877, 384243, 384608, 384973, 385338, 385704, 386069, 386434, 386799, 387165, 387530, 387895, 388260, 388626, 388991, 389356, 389721, 390087, 390452, 390817, 391182, 391548, 391913, 392278, 392643, 393009, 393374, 393739, 394104, 394470, 394835, 395200, 395565, 395931, 396296, 396661, 397026, 397392, 397757, 398122, 398487, 398853, 399218, 399583, 399948, 400314, 400679, 401044, 401409, 401775, 402140, 402505, 402870, 403236, 403601, 403966, 404331, 404697, 405062, 405427, 405792, 406158, 406523, 406888, 407253, 407619, 407984, 408349, 408714, 409080, 409445, 409810, 410175, 410541, 410906, 411271, 411636, 412002, 412367, 412732, 413097, 413463, 413828, 414193, 414558, 414924, 415289, 415654, 416019, 416385, 416750, 417115, 417480, 417846, 418211, 418576, 418941, 419307, 419672, 420037, 420402, 420768, 421133, 421498, 421863, 422229, 422594, 422959, 423324, 423690, 424055, 424420, 424785, 425151, 425516, 425881, 426246, 426612, 426977, 427342, 427707, 428073, 428438, 428803, 429168, 429534, 429899, 430264, 430629, 430995, 431360, 431725, 432090, 432456, 432821, 433186, 433551, 433917, 434282, 434647, 435012, 435378, 435743, 436108, 436473, 436839, 437204, 437569, 437934, 438300, 438665, 439030, 439395, 439761, 440126, 440491, 440856, 441222, 441587, 441952, 442317, 442683, 443048, 443413, 443778, 444144, 444509, 444874, 445239, 445605, 445970, 446335, 446700, 447066, 447431, 447796, 448161, 448527, 448892, 449257, 449622, 449988, 450353, 450718, 451083, 451449, 451814, 452179, 452544, 452910, 453275, 453640, 454005, 454371, 454736, 455101, 455466, 455832, 456197, 456562, 456927, 457293, 457658, 458023, 458388, 458754, 459119, 459484, 459849, 460215, 460580, 460945, 461310, 461676, 462041, 462406, 462771, 463137, 463502, 463867, 464232, 464598, 464963, 465328, 465693, 466059, 466424, 466789, 467154, 467520, 467885, 468250, 468615, 468981, 469346, 469711, 470076, 470442, 470807, 471172, 471537, 471903, 472268, 472633, 472998, 473364, 473729, 474094, 474459, 474825, 475190, 475555, 475920, 476286, 476651, 477016, 477381, 477747, 478112, 478477, 478842, 479208, 479573, 479938, 480303, 480669, 481034, 481399, 481764, 482130, 482495, 482860, 483225, 483591, 483956, 484321, 484686, 485052, 485417, 485782, 486147, 486513, 486878, 487243, 487608, 487974, 488339, 488704, 489069, 489435, 489800, 490165, 490530, 490896, 491261, 491626, 491991, 492357, 492722, 493087, 493452, 493818, 494183, 494548, 494913, 495279, 495644, 496009, 496374, 496740, 497105, 497470, 497835, 498201, 498566, 498931, 499296, 499662, 500027, 500392, 500757, 501123, 501488, 501853, 502218, 502584, 502949, 503314, 503679, 504045, 504410, 504775, 505140, 505506, 505871, 506236, 506601, 506967, 507332, 507697, 508062, 508428, 508793, 509158, 509523, 509889, 510254, 510619, 510984, 511350, 511715, 512080, 512445, 512811, 513176, 513541, 513906, 514272, 514637, 515002, 515367, 515733, 516098, 516463, 516828, 517194, 517559, 517924, 518289, 518655, 519020, 519385, 519750, 520116, 520481, 520846, 521211, 521577, 521942, 522307, 522672, 523038, 523403, 523768, 524133, 524499, 524864, 525229, 525594, 525960, 526325, 526690, 527055, 527421, 527786, 528151, 528516, 528882, 529247, 529612, 529977, 530343, 530708, 531073, 531438, 531804, 532169, 532534, 532899, 533265, 533630, 533995, 534360, 534726, 535091, 535456, 535821, 536187, 536552, 536917, 537282, 537648, 538013, 538378, 538743, 539109, 539474, 539839, 540204, 540570, 540935, 541300, 541665, 542031, 542396, 542761, 543126, 543492, 543857, 544222, 544587, 544953, 545318, 545683, 546048, 546414, 546779, 547144, 547509, 547875, 548240, 548605, 548970, 549336, 549701, 550066, 550431, 550797, 551162, 551527, 551892, 552258, 552623, 552988, 553353, 553719, 554084, 554449, 554814, 555180, 555545, 555910, 556275, 556641, 557006, 557371, 557736, 558102, 558467, 558832, 559197, 559563, 559928, 560293, 560658, 561024, 561389, 561754, 562119, 562485, 562850, 563215, 563580, 563946, 564311, 564676, 565041, 565407, 565772, 566137, 566502, 566868, 567233, 567598, 567963, 568329, 568694, 569059, 569424, 569790, 570155, 570520, 570885, 571251, 571616, 571981, 572346, 572712, 573077, 573442, 573807, 574173, 574538, 574903, 575268, 575634, 575999, 576364, 576729, 577095, 577460, 577825, 578190, 578556, 578921, 579286, 579651, 580017, 580382, 580747, 581112, 581478, 581843, 582208, 582573, 582939, 583304, 583669, 584034, 584400, 584765, 585130, 585495, 585861, 586226, 586591, 586956, 587322, 587687, 588052, 588417, 588783, 589148, 589513, 589878, 590244, 590609, 590974, 591339, 591705, 592070, 592435, 592800, 593166, 593531, 593896, 594261, 594627, 594992, 595357, 595722, 596088, 596453, 596818, 597183, 597549, 597914, 598279, 598644, 599010, 599375, 599740, 600105, 600471, 600836, 601201, 601566, 601932, 602297, 602662, 603027, 603393, 603758, 604123, 604488, 604854, 605219, 605584, 605949, 606315, 606680, 607045, 607410, 607776, 608141, 608506, 608871, 609237, 609602, 609967, 610332, 610698, 611063, 611428, 611793, 612159, 612524, 612889, 613254, 613620, 613985, 614350, 614715, 615081, 615446, 615811, 616176, 616542, 616907, 617272, 617637, 618003, 618368, 618733, 619098, 619464, 619829, 620194, 620559, 620925, 621290, 621655, 622020, 622386, 622751, 623116, 623481, 623847, 624212, 624577, 624942, 625308, 625673, 626038, 626403, 626769, 627134, 627499, 627864, 628230, 628595, 628960, 629325, 629691, 630056, 630421, 630786, 631152, 631517, 631882, 632247, 632613, 632978, 633343, 633708, 634074, 634439, 634804, 635169, 635535, 635900, 636265, 636630, 636996, 637361, 637726, 638091, 638457, 638822, 639187, 639552, 639918}; 
bool work[]={true,true,true,true,true,true,false,false};
bool leap(int year);
int date(int y, int m,int d){
	if (y<=1752)
	{
		int day=0;
		/*for(int i=1;i<y;i++)
			if(leap(i)) day+=366;else day+=365;*/
		day+=year_day[y-1];
		if(leap(y))
			for(int i=1;i<m;i++)
				day+=month_run[i];
		else for(int i=1;i<m;i++)
			day+=month_ping[i];
		if(y==1752 && m==9)
			day-=11;
		day+=d;
		if((day+5)%7==0) return 7;else return (day+5)%7;
	} 
	if(m==1||m==2) m+=12,y--;
	int iWeek = (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;
	iWeek++;
	return iWeek;
}

bool leap(int year)  //判断year是否为闰年
{
	if(year<1582)
		return !(year%4);   //当year<1582时,只要能被4整除就是闰年
	else
	{
		if(year==1700) //当year=1700时,历史原因,无条件为闰年
			return true;
 
		if((!(year%4)&&(year%100)) || !(year%400))   //当year>=1582时,能被4整除且不被100整除为闰年
			return true;                             //或能被400整除时为闰年
	}
	return false;
}

int main()
{
	//freopen("data.in","r",stdin);
	int t;
	cin>>t;
	while(t--)
	{
		int sy,sm,ey,em;
		int good=0,lucky=0;
		cin>>sy>>sm>>ey>>em;
		if(sy==ey)
		{
			for(int i=sm;i<=em;i++)
			{
				int day=1;
				while(!work[date(sy,i,day)]) day++;
				if(date(sy,i,day)==1) good++;
				if(leap(sy)) day=month_run[i];
					else day=month_ping[i];
				while(!work[date(sy,i,day)]) day--;
				if(date(sy,i,day)==5) lucky++;
			}
		}else
		{
			for(int i=sm;i<=12;i++)
			{
				int day=1;
				while(!work[date(sy,i,day)]) day++;
				if(date(sy,i,day)==1) good++;
				if(leap(sy)) day=month_run[i];
					else day=month_ping[i];
				while(!work[date(sy,i,day)]) day--;
				if(date(sy,i,day)==5) lucky++;
			}
			for(int i=sy+1;i<=ey-1;i++)
			{
				for(int j=1;j<=12;j++)
				{
					int day=1;
					while(!work[date(i,j,day)]) day++;
					if(date(i,j,day)==1) good++;
					if(leap(i)) day=month_run[j];
						else day=month_ping[j];
					while(!work[date(i,j,day)]) day--;
					if(date(i,j,day)==5) lucky++;						
				}
			}
			for(int i=1;i<=em;i++)
			{
				int day=1;
				while(!work[date(ey,i,day)]) day++;
				if(date(ey,i,day)==1) good++;
				if(leap(ey)) day=month_run[i];
					else day=month_ping[i];
				while(!work[date(ey,i,day)]) day--;
				if(date(ey,i,day)==5) lucky++;
			}
		}
		cout<<lucky<<" "<<good<<endl;
	}
	return 0;
 } 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值