C++ 算法:计算任意日期的儒略日
C++ 算法:计算任意日期的儒略日
本代码实现了一个 C++ 算法,用于计算任意日期的儒略日。儒略日是一个连续的日期计数系统,从公元前 4713 年 1 月 1 日开始计数,每个日期都对应一个唯一的整数。此算法可以处理公元前和公元后的日期,并考虑了闰年规则。
代码示例
#include <iostream>
typedef long long LL;
const int D = 3146100;
using namespace std;
int T = 146097;
int T1 = 3000000;
int days[D],mon[D],year[D];
const int months[13] = {0, 31, 28, 31, 30 , 31, 30, 31, 31, 30, 31, 30, 31 };
bool isleapyear(int y)
{
if(y < 0) return (y % 4 == -1);
if(y >=1 && y <= 1582 ) return (y % 4 == 0);
return y % 400 == 0 || (y % 4 == 0 && y % 100);
}
int getdays(int y, int m)
{
if(m == 2) return months[m] + isleapyear(y);
return months[m];
}
void predeal()
{
int d = 1, m = 1, y = -4713;
int r = T + T1;
for(int k = 0; k <= r; k ++)
{
days[k] = d, mon[k] = m, year[k] = y;//assign
if (d == 4 && m == 10 && y == 1582) {
d = 15;
} else if ( getdays(y, m) == d) {
d = 1;
if (m == 12) {
m = 1, y ++;
if (y == 0) y++;
} else m++;
} else d++;
}
}
int main()
{
predeal();
int q;
cin >> q;
while (q --)
{
LL r;
scanf("%lld","&r);
if (r <= T + T1)
{
if (year[r] < 0) printf("%d %d %d BC\n", days[r], mon[r], -year[r]);
else printf("%d %d %d\n", days[r], mon[r], year[r]);
}
else {
int target = T1 + ((r - T1) % T);
printf("%d %d %d\n", days[target], mon[target], year[target] + (r - T1)/T * 400 );
}
}
return 0;
}//转换为Go内容:package main
import "fmt"
const (
D int = 3146100
T int = 146097
T1 int = 3000000
)
var (
days [D]int
mon [D]int
year [D]int
months [13]int = [13]int{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
)
func isLeapYear(y int) bool {
if y < 0 {
return y % 4 == -1
}
if y >= 1 && y <= 1582 {
return y % 4 == 0
}
return y%400 == 0 || (y%4 == 0 && y%100 != 0)
}
func getDays(y, m int) int {
if m == 2 {
return months[m] + boolToInt(isLeapYear(y))
}
return months[m]
}
func boolToInt(b bool) int {
if b {
return 1
}
return 0
}
func predeal() {
d, m, y := 1, 1, -4713
r := T + T1
for k := 0; k <= r; k++ {
days[k] = d
mon[k] = m
year[k] = y
if d == 4 && m == 10 && y == 1582 {
d = 15
} else if getDays(y, m) == d {
d = 1
if m == 12 {
m = 1
y++
if y == 0 {
y++
}
} else {
m++
}
} else {
d++
}
}
}
func main() {
predeal()
var q int
fmt.Scan(&q)
for q > 0 {
var r int64
fmt.Scan(&r)
if r <= T+T1 {
if year[r] < 0 {
fmt.Printf("%d %d %d BC\n", days[r], mon[r], -year[r])
} else {
fmt.Printf("%d %d %d\n", days[r], mon[r], year[r])
}
} else {
target := T1 + int((r-T1)%int64(T))
fmt.Printf("%d %d %d\n", days[target], mon[target], year[target]+int((r-T1)/int64(T))*400)
}
q--
}
原文地址: https://www.cveoy.top/t/topic/pFYO 著作权归作者所有。请勿转载和采集!