首页 > 试题广场 >

小陆每天要写一份工作日报,日报标准是“入职第X天-小陆-XX

[问答题]
小陆每天要写一份工作日报,日报标准是“入职第X天-小陆-XXX”,对于“入职第几天”,小陆现在每次需要对上次写的日报标题里的天数+1, 遇到周末还要多加2天等等。请你写一段程序,帮小陆自动完成这件事,提供写日期当天的年月日,算出已入职的天数(假定小陆的入职时间是 2014年8月18日)。要求:不能使用时间,日期相关的库函数。
推荐
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
 Date date=sdf.parse("2014/08/18");
 Long sTime = date.getTime();
 Long eTime = new Date().getTime();
 Long day = ((eTime-sTime)/(1000*60*60*24));
 System.out.println(day);
编辑于 2015-01-31 09:50:28 回复(2)
题目的意思就是算出小陆的入职时间到今天中间一共有多少天,不能使用相关函数,
那就只能一天一天的数,14年的入职天数,加上15年年初到当天中间一共有多少天,
再加上当天,中间的二月份是28天

编辑于 2015-11-02 11:39:43 回复(0)
#include <iostream>
using namespace std;

//每个月多少天
const int daysInMonth[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

//入职年月日
const int YEAR = 2014;
const int MONTH = 8;
const int DAY = 18;

//函数功能:是否为闰年
inline bool isLeapYear(int year) { return (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)); }

//函数功能:某一年有多少天
inline int allDaysOfYear(int year) {
	return isLeapYear(year) ? 366 : 365;
}

//函数功能:[year1, year2)年间一共有多少天,仅考虑年
int daysBetweenYears(int year1, int year2) {
	int sum = 0;
	for (int i = year1; i < year2; i++) {
		sum += allDaysOfYear(i);
	}
	return sum;
}

//函数功能:给出日期,计算出该年的第多少天。
int daysInYear(int year, int month, int day) {
	int result = day;
	for (int i = 0; i < month - 1; i++) {
		if (i == 1 && isLeapYear(year))
			result += 1;
		result += daysInMonth[i];
	}
	return result;
}

//函数功能:从入职起多少天
int daysFromEntry(int year, int month, int day) {
	if (year < YEAR) return 0;
	int daysOfYear = daysInYear(year, month, day);
	int daysEntryYear = daysInYear(YEAR, MONTH, DAY);
	if (daysOfYear < daysEntryYear && year == YEAR) return 0;
	int result = 0;	
	return daysOfYear - daysEntryYear + daysBetweenYears(YEAR, year) + 1;	
}

//函数功能:日期输入是否合法
bool isCorrectDate(int year, int month, int day) {
	if (month <= 0 || month > 12 || day <= 0) return false;
	if (isLeapYear(year) && month == 2 && day <= daysInMonth[1] + 1) 	
		return true;
	if (day <= daysInMonth[month - 1]) return true;
	return false;
}

int main() {
	int year, month, day;
	year = 2015;
	for (month = 1; month <= 12; month++)
	{
		for (day = 1; day <= 31; day++)
		{
			if (!isCorrectDate(year, month, day))
				cout << "日期错误" << endl;
			else
				cout << month << "-" << day << " : " << daysFromEntry(year, month, day) << endl;
		}
		system("pause");
	}

	return 0;
}

编辑于 2015-11-14 15:24:59 回复(0)
 static int[] months = new int[] { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
        
        static bool isLeapYear(int year)
        {
            return year % 400 == 0 || (year % 4 == 0 && year%100!=0);
        }

        static int Main(int y1,int m1,int d1,int y2,int ,m2,int d2)
        {

            int sum1= YearDay(y1, m1, d1);//表示第一个日期已走天数
            int sum2= YearDay(y2,m2,d2);//表示第二个日期已走天数
            int sum3=0;//表示第一个日期到第二个日期的中间年份总天数
            for (int i = y1; i < y2; i++)
                sum3 += YearDay(i,months.Length,31);
            //sum3-sum1表示到第二个年份之前所走天数,加上第二个日期走的天数即可获得中间所有的天数
            Console.WriteLine((sum2+sum3 - sum1)%7);
             return(sum2+sum3 - sum1)%7);
        }

        static int YearDay(int y1,int m1,int d1)
        {
            int sumDay = 0;
            for (int j = 0; j < m1 - 1; j++)
            {
                if (j == 1 && isLeapYear(y1))
                    sumDay += 1;
                sumDay += months[j];
            }
            return sumDay + d1;
        }
发表于 2020-03-12 13:12:28 回复(0)
#include<stdio.h>
#include<iostream>
using namespace std;
int main() {
	int year, month, day;
	//wd入职天数;nd入职日期数值化
	int wd = 0, nd = 0, ipd = 0;
	int md[12] = { 31,28,31,30,31,30,31,31,30,31,10,31 };
	int years[1000];
	cin >> year >> month >> day;
	//中间年份闰年问题解决
	for (int i = 0; i < year - 2014; i++) {
		years[i] = 2015 + i;
		if (years[i] % 4 == 0 && years[i] % 100 != 0 || years[i] % 400 == 0) {
			md[1] = 29;
			ipd += 1;
		}
		else
		{
			md[1] = 28;
		}
	}
	//将2014年1月1日看做原点,然后日期数值化 nd = 18;
	for (int i = 1; i < 8; i++) {
		nd += md[i];
	}
	//输入的日期数值化
	ipd += (year - 2014) * 365 + day;
	for (int i = 1; i < month; i++) {
		ipd += md[i];
	}
	wd = ipd - nd;
	cout << wd;
	return 0;
}
这题居然不给个能测试通过率的题型,这会让我觉得我100%行
发表于 2019-09-07 16:06:52 回复(0)
#include <iostream>
using namespace std;

const int months[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
const int YEAR = 2014;
const int MONTH = 8;
const int DAY = 18;
//是否为闰年
int isLeapYear(int year){
    return (year % 4 == 0 && year % 100) || (year & 400 == 0);
}
//某年天数。
int daysOfYear(int year){
    return isLeapYear(year) ? 366 : 365;
}
//某年经过的天数。
int daysOfPass(int year, int month, int day){
    int res = 0;
    for(int i = 0; i < month - 1; i++) res += months[i];
    res += isLeapYear(year) ? day + 1 : day;
    return res;
}
//距离明年的天数。
int daysToNextYear(){
    return daysOfYear(YEAR) - daysOfPass(YEAR, MONTH, DAY) + 1;
}
//总天数。
int daysOfWork(int year, int month, int day){
    if(YEAR == year){
        return daysOfPass(year, month, day) - daysOfPass(YEAR, MONTH, DAY) + 1;
    }
    int res = daysToNextYear();
    for(int i = YEAR + 1; i < year; i++)
        res += daysOfYear(i);
    res += daysOfPass(year, month, day);
    return res;
}

int main(){
    cout << daysOfWork(2014, 8, 31) << endl;
    cout << daysOfWork(2016, 3, 5) << endl;
}

发表于 2019-03-01 12:21:14 回复(0)