测试了两千多组随机数据没问题,但就是过不了
查看原帖
测试了两千多组随机数据没问题,但就是过不了
220167
msd1125107427楼主2023/10/3 16:33

来自一个蒟蒻的求助

谁能帮我看一下QAQ

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
int m[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
ll Q, year, day, month;
ll r;
inline ll qr(){//快读 
	ll x = 0;
	char c = 0;
	while (!isdigit(c))
		c = getchar();
	while (isdigit(c))
		x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
	return x;
}
inline void qw(ll x) {//快写 
	if (x > 9)
		qw(x / 10);
	putchar(x % 10 + '0');
}
void count(ll r){
	year = -4712, day = 1, month = 1;
	if (r <= 2299160) {// 1582年以前 
		ll k = r / 1461;
		r %= 1461, year += k * 4;
		while (r >= 365) {
			if(year % 4 == 0) r--;
			r -= 365, year++;
		}
		if(r == -1)
			--year, month = 12, day = 31;
		else {
			while (r >= m[month]) {
				r -= m[month], month++;
				if(month == 2 && year & 3 == 0)
					r--;
			}
			day += r;	
		}
	}
	else {//以后 
		if (r > 2299160)
			r += 10;
		r -= 2298884, year = 1582;
		if (r > 365 * 19 + 6)
			r -= 365 * 19 + 5, year = 1601;
		ll k = r / 146097;
		r %= 146097, year += k * 400;
		k = r / 36524;
		r %= 36524, year += k * 100;
		k = r / 1461;
		r %= 1461, year += k * 4;//把整四年的全部化掉 
		while (r >= 365) {
			if (!(year & 3) && year % 100 || year % 400 == 0)
				r--;
			r -= 365, year++;
		}
		if (r == -1)
			--year, month = 12, day = 31;
		else {
			while (r >= m[month]) {
				r -= m[month], month++;//月 
				if (month == 2 && (year & 3 == 0 && year % 100 != 0 || year % 400 == 0))
					r--;
			}
			day += r;//日 
		}
	}
	if (year <= 0)//输出 
		qw(day), putchar(' '), qw(month), putchar(' '), qw(-year + 1),
		putchar(' '), putchar('B'), putchar('C'), putchar('\n');
	else
		qw(day), putchar(' '), qw(month), putchar(' '), qw(year), putchar('\n');
	return;
}
int main()
{
	Q = qr();
	while (Q--){
		r = qr();
		count(r);
	}
	return 0;
}
2023/10/3 16:33
加载中...