模拟时间进制转换,并输出当年日历

  这个是朋友托我打的,不属于ACM,但觉得挺有意思,所以就放到这里了,题目有两个要求,输出当1年1月1日到前年每月的1号隔了多少天,并输出这天是星期几,然后再按格式输出这一年12个月的公历日历。

是一个挺简单的模拟,就是有点小麻烦和小细节需要注意,下面是代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
struct Node
{
    int y,m,d,day;
};
Node start;
void init()
{
    start.y = 1;
    start.m = 1;
    start.d = 1;
    start.day = 1;
}
bool is_leap(int year)
{
    if(year%400==0 || (year%4==0&&year%100 != 0))return true;
    else return false;
}
int day_of_month(int year,int m)
{
    if(m==1||m==3||m==5||m==7||m==8||m==10||m==12) return 31;
    if(m==2)
    {
        if(is_leap(year)) return 29;
        return 28;
    }
    return 30;
}
Node tmp;
int getday(Node now)
{
    tmp = start;
    int ans = 0;
    bool flag = false;
    while(tmp.y<=now.y)
    {
        while(tmp.m <= 12)
        {
            while(tmp.d <= day_of_month(tmp.y,tmp.m))
            {
                if(tmp.y==now.y&&tmp.m==now.m&&tmp.d==now.d)
                {
                    flag = true;
                    break;
                }
                tmp.d++;
                tmp.day++;
                if(tmp.day==8)
                {
                    tmp.day = 1;
                }
                ///cout<<"year month day d:"<<tmp.y<<" "<<tmp.m<<" "<<tmp.d<<" "<<tmp.day<<endl;
                ans++;
            }
            if(flag) break;
            tmp.d = 1;
            tmp.m++;
        }
        if(flag) break;
        tmp.m = 1;
        tmp.y++;
    }
    return ans;
}
int main()
{
    int nowyear;
    scanf("%d",&nowyear);
    init();
    Node now;
    now.y = nowyear;
    now.d = 1;
    int firstday[13];
    int allday[13];
    for(int i = 1; i <= 12; i++)
    {
        now.m = i;
        int res = getday(now);
        printf("到%d年%d月1号共有%d天\n",nowyear,i,res);
        printf("这天是星期%d\n",tmp.day);
        firstday[i] = tmp.day;
        allday[i] = day_of_month(nowyear,i);
        puts("");
    }
    for(int i = 1; i <= 12; i++)
    {
        printf("      %d月    \n",i);
        printf("-----------------------\n");
        ///printf("  7  1  2  3  4  5  6\n");
        printf(" 日 一 二 三 四 五 六\n");
        int key = firstday[i];
        ///cout<<"key = "<<key<<endl;
        if(key < 7)
        {
            for(int j = 1;j <= key;j++)
                cout<<"   ";
        }
        int tot = 1,k1 = key==7?7:7-key,k0 = 0;
        bool mark = false;
        while(tot <= allday[i])
        {
            printf("%3d",tot);
            k0++;
            tot++;
            if(k0==k1 && !mark)
            {
                puts("");
                k0 = 0;
                mark = true;
            }
            if(mark&&k0==7)
            {
                puts("");
                k0 = 0;
            }
        }
        puts("");
    }
    return 0;
}
时间: 2024-10-07 19:19:23

模拟时间进制转换,并输出当年日历的相关文章

51nod 1315 合法整数集 (位操作理解、模拟、进制转换)

1315 合法整数集 题目来源: TopCoder 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 取消关注 一个整数集合S是合法的,指S的任意子集subS有Fun(SubS)!=X,其中X是一个固定整数,Fun(A)的定义如下: A为一个整数集合,设A中有n个元素,分别为a0,a1,a2,...,an-1,那么定义:Fun(A)=a0 or a1 or ... or an-1:Fun({}) = 0,即空集的函数值为0.其中,or为或操作. 现在

入门模拟——(进制转换)B1022.D进制的A+B

#include <bits/stdc++.h> #include<math.h> using namespace std; const int MAX_LEN = 100005; const int MAX_D = 31; int main(){ int a,b,n; cin>>a; cin>>b; int temp = a+b; cin>>n; int result[MAX_D]; int num = 0; do{ result[num++]

HDU4814——数学,模拟进制转换

本题围绕:数学公式模拟进制转换 HDU4814 Golden Radio Base 题目描述 将一个十进制的非负整数转换成E(黄金分割数)进制的数 输入 不大于10^9的非负整数,处理到文件尾 输出 转换成的E进制数(可能含有小数) 样例输入 1 2 3 6 10 样例输出 1 10.01 100.01 1010.0001 10100.0101 题目分析 对于本题,要注意的点有:首先对于一个十进制的正数,我们是可以严格转换成一个E(黄金分割数)进制的数的,而不是涉及到约等于,例如10-base的

Spreadsheets codeforces1B(模拟+进制转换)

http://codeforces.com/problemset/problem/1/B 题意:转换两种行和列的表示方法. 分析:(弱弱的说下一开始自己并不会写,只是想到AA=26*1+1,就想着用除法和余数来解决了,后来发现这么模拟下去,数据好大啊,心好累..然后就没有然后了).后来问的别人,告诉我用26进制转换(我去,我为啥想不到,啥都别说了,看代码) #include <iostream> #include <stdio.h> #include <string.h>

大数进制转换问题

在数据结构课关于栈的这一章中,我们都学过用"模2取余法"来将一个10进制数转换为一个二进制数,进而可以推广到"模n取余法",经其转换为n进制(n任意指定). 确实,这是一个很基础的题目,可你是否想过如果这个10进制数是一个大数(其位数可能上千位,此时用一般数据类型肯定是会溢出的),那么这个问题又如何来求解呢? 当然,也许你会说很简单嘛,自己写一个大数类(当然至少要写一个大数除法才行),或者你用的是Java这种现代化语言,就更轻松了,直接用BigInteger这样的大

ACM——进制转换

http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1012 进制转换 时间限制(普通/Java):1000MS/3000MS          运行内存限制:65536KByte总提交:1362            测试通过:395 描述 将一个十进制数N转换成R进制数输出,2≤R≤16,R≠10. 输入 多行.第一行指出以下一共有多少组数据,后续每行包含两个整数N和R,以空格分隔,-100000

九度oj 题目1080:进制转换

题目描述: 将M进制的数X转换为N进制的数输出. 输入: 输入的第一行包括两个整数:M和N(2<=M,N<=36). 下面的一行输入一个数X,X是M进制的数,现在要求你将M进制的数X转换成N进制的数输出. 输出: 输出X的N进制表示的数. 样例输入: 16 10 F 样例输出: 15 提示: 输入时字母部分为大写,输出时为小写,并且有大数据. 这题初看起来另我头疼,考虑不难但是很麻烦 一开始想的比较绕,准备先把任意进制转换成10进制,再转化成n进制,于是写出了下面的代码 1 #include

进制转换、基础语音、语句的总结与练习

C#阶段总结 一.进制转换 计算机中采用的是二进制,因为二进制具有运算简单,易实现且可靠,为逻辑设计提供了有利的途径.节省设备等优点. 我们常用的进制还有八进制.十进制.十六进制,其特点是: (1)逢N进一  N是每种进位计数制表示一位数所需要的符号数目为基数. 二进制:逢二进一,借一当二 八进制:逢八进一,借一当八 十六进制:逢十六进一,借一当十六 (2)数制转换  不同进位计数制之间的转换原则:不同进位制之间的转换是根据两个有理数如相等,则两数的整数部分和分数部分一定分别相等的原则进行的.也

高精度的进制转换

1 #include <stdio.h> 2 #include <string.h> 3 4 char str[1000];//输入字符串 5 int start[1000],ans[1000],res[1000]; //被除数,商,余数 6 //res[]存的是余数,其最后结果的逆序为所求的结果 7 //转换前后的进制 8 const int oldBase = 10; 9 const int newBase = 2; 10 11 void change() 12 { 13 //