思路:year:=2021,month:=9
求出2021年8月31日,距离1900年1月1日的总天数,除以7取余数,就是空格的数量
万年历是连着的,一行有七个,所以7的余数就是当月一号所在的列数 -1 ,所在列数就是(余数 +1)
c++

#include <iostream>
using namespace std;


int main()
{
    int year = 0;
    int month = 0;
    int sum = 0; //总天数
    cout << "请输入年份:" ;
    cin >> year;
    cout << "请输入月份:";
    cin >> month;
    //求出从1999到year的总天数
    for (int i = 1900; i < year; i++) {
        if (i%4 == 0&& i%100 != 0 || i%400 == 0){
            sum += 366;
        }else{
            sum += 365;
        }
    }
    // 求year年1月到(month-1)月的总天数
    int day = 0;//month月的天数
    for (int i = 1;i <= month;i++){
        if(i == 1||i == 3||i == 5||i == 7||i == 8||i == 10||i == 12){
            day = 31;
            sum += 31;
        }
        else if(i == 4||i == 6||i == 9||i == 11){
            day = 30;
            sum += 30;
        }
        else {
            if(year %4==0&&year % 100!=0||year % 400 ==0){
                day = 29;
                sum += 29;
            }else{
                day = 28;
                sum += 28;
            }
        }
        //由于上述循环把本月的天数也加了,所以需要减去
        if(i == month)
            sum -= day;
	}
    cout <<"sum :" << sum << endl;
    int space = sum % 7;
    cout <<"space :" << space << endl;
    cout << "一\t二\t三\t四\t五\t六\t日"<<endl;

    //打印空格
    for (int i = 0; i < space;i++){
         cout << "\t";
    }
    //打印数字
    for (int i=1;i<=day;i++){
        cout << i <<"\t";
        //换行
        if ((i+space) % 7 ==0){
            cout << endl;
        }
    }
	cout << endl;
}

golang

package main
import ("fmt" 
)
func test1(){
    //1.给定年份和月份,可以键盘输入:
    var year int
    fmt.Print("请输入年份:")
    fmt.Scanf("%d",&year)
    var month int
    fmt.Print("请输入月份:")
    fmt.Scanf("%d",&month)
    //2.求出2018年7月31日到1900年1月1日的总天数
    sum := 0 //总天数
    //2.1先累加整年的天数
    for i := 1900; i < year; i++ {
		if i%4 == 0&& i%100 != 0 || i%400 == 0{
			sum += 366
		}else{
			sum += 365
		}
	}
	//2.2求2018年1月到7月的总天数
    day := 0 //每个月的天数
	for i := 1;i <= month;i++{
		switch i {
		case 1,3,5,7,8,10,12:{
			day = 31
			sum += 31
		}
		case 4,6,9,11:{
			day = 30
			sum += 30
		}
		case 2:
			if i%4 == 0&& i%100 != 0 || i%400 == 0{
				day = 29
				sum += 29
			}else{
				day = 28
				sum += 28
			}
		}
		if i == month{
			sum -= day
		}
	}
	fmt.Println(sum);
	//3.计算空格的数量
    space := sum % 7
    //打印
    fmt.Println("一\t二\t三\t四\t五\t六\t日")
    //打印空格
    for i:=0;i<space;i++{
        fmt.Print("\t")
    }
    //打印数字
    for i:=1;i<=day;i++{
        fmt.Print(i,"\t")
        //换行
        if (i+space) % 7 ==0{
            fmt.Println()
        }
    }
	fmt.Println()
}


func main()  {
	test1()

}