思路: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()
}