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 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录