首页 > 试题广场 >

淘宝网店

[编程题]淘宝网店
  • 热度指数:2806 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
NowCoder在淘宝上开了一家网店。他发现在月份为素数的时候,当月每天能赚1元;否则每天能赚2元。
现在给你一段时间区间,请你帮他计算总收益有多少。

输入描述:
输入包含多组数据。

每组数据包含两个日期from和to (2000-01-01 ≤ from ≤ to ≤ 2999-12-31)。

日期用三个正整数表示,用空格隔开:year month day。


输出描述:
对应每一组数据,输出在给定的日期范围(包含开始和结束日期)内能赚多少钱。
示例1

输入

2000 1 1 2000 1 31
2000 2 1 2000 2 29

输出

62
29
import java.util.Scanner;
import java.time.LocalDate;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextInt()) {
            int year = in.nextInt();
            int month = in.nextInt();
            int day = in.nextInt();
            int year1 = in.nextInt();
            int month1 = in.nextInt();
            int day1 = in.nextInt();
            LocalDate L1 = LocalDate.of(year, month, day);
            LocalDate L2 = LocalDate.of(year1, month1, day1);
            System.out.println(date(L1, L2));

        }
    }
    //计算获取收益
    public static int date(LocalDate L1, LocalDate L2) {
        int count = 0;
        while (!L1.isAfter(L2)) {
            if (isSuShu(L1.getMonthValue())) {
                count++;
            }else{
                count+=2;
            }
            L1 = L1.plusDays(1);
        }

        return count;

    }
    private static boolean isSuShu(int month) {
        if (month == 2 || month == 3 || month == 5 || month == 7 || month == 11) {
            return true;
        } else {
            return false;
        }
    }

}  大佬帮忙看看我这错哪里呢?
在IDEA上没报错  但是在牛客上出现这个错误,于是我便把他的测试用例每个单独运行,结果都对着
这为啥?
上面报错 是2100这年2月没有29天,但是我测试是发现结果为28天对着,这是为啥,
有没有大佬帮忙分析分析。万分感谢! 

发表于 2023-04-26 21:21:17 回复(0)
import java.util.*;

/*
 * 淘宝网店
 */
public class Main {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		while(sc.hasNextInt()) {
			int fromYear=sc.nextInt();
			int fromMonth=sc.nextInt();
			int fromDay=sc.nextInt();
			int toYear=sc.nextInt();
			int toMonth=sc.nextInt();
			int toDay=sc.nextInt();
			
			Set<Integer>set=new HashSet<>();//添加素数方便查找
			set.add(2);set.add(3);set.add(5);
			set.add(7);set.add(11);
			int money=0;
			int day=0;
			if(fromYear==toYear) {
				if(fromMonth==toMonth) {
					money=sameMonth(fromDay, fromMonth, fromYear, toDay, toMonth, toYear, set);
				}else {
					money=sameYear(fromDay, fromMonth, fromYear, toDay, toMonth, toYear, set);
				}
			}else {//不同年
				money+=sameYear(fromDay, fromMonth, fromYear, 31, 12, fromYear, set);//第一年
				money+=sameYear(1, 1, toYear, toDay, toMonth, toYear, set);//最后一年
				int temp=fromYear+1;
				while( temp<toYear){
					money+=sameYear(1, 1, temp, 31, 12, temp, set);
					temp++;
				}
				
			}
			System.out.println(money);
			
		}
	}
	//是否是闰年
	public static boolean isLeapYear(int year) {
		return (year%4==0&&year%100!=0)||year%400==0;
	}
//计算某个月多少天
	public static int manyDay(int year,int month) {
		switch(month) {
		case 1:case 3:case 5 :
		case 7:case 8: case 10:case 12:return 31;
		case 4:case 6:case 9:case 11:return 30;
		default:
			if(isLeapYear(year)==true) {
				return 29;
			}
			else {
				return 28;
			}
		}
	}
	//同年不同月
	public static int sameYear(int fromDay,int fromMonth,int fromYear,int toDay,int toMonth,int toYear,Set<Integer>set) {
		int money=0;
		int day=0;
		day=manyDay(fromYear, fromMonth)-fromDay+1;//初始月的天数,包括初始日期
		if(set.contains(fromMonth)) {//是否是素月
			money+=day*1;
		}else {
			money+=day*2;
		}
		day=toDay;//结束月的天数
		if(set.contains(toMonth)) {
			money+=day*1;
		}else {
			money+=day*2;
		}
		
		//中间月
		for(int i=fromMonth+1;i<toMonth;i++) {
			day=manyDay(fromYear, i);
			if(set.contains(i)) {
				money+=day*1;
			}else {
				money+=day*2;
			}
		}
		return money;
	}
	//同年同月
	public static int sameMonth(int fromDay,int fromMonth,int fromYear,int toDay,int toMonth,int toYear,Set<Integer>set) {
		int money=0;
		int day=0;
		day=toDay-fromDay+1;//初始月的天数,包括初始日期
		if(set.contains(fromMonth)) {//是否是素月
			money+=day*1;
		}else {
			money+=day*2;
		}
		return money;
	}
}

发表于 2023-04-12 20:38:40 回复(0)


import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNextInt()) {
            int from_year = scanner.nextInt();
            int from_month = scanner.nextInt();
            int from_day = scanner.nextInt();
            int to_year = scanner.nextInt();
            int to_month = scanner.nextInt();
            int to_day = scanner.nextInt();
            int sum = 0;

            if (from_year == to_year) {//如果是同一年
                System.out.println(getProfit(from_year, from_month, from_day, to_year, to_month, to_day));
                continue;
            }
            // 当 两个是不同年时
            //1、 处理 初始年到年底的利润
            sum += getProfit(from_year, from_month, from_day, from_year, 12, 31);
            //2、终止年 1月1号 到终止日期的利润
            sum += getProfit(to_year, 1, 1, to_year, to_month, to_day);
            //3、之间完整年份的利润
            for (int i = from_year + 1; i < to_year ; i++) {
                sum += getProfit(i, 1, 1, i, 12, 31);
            }
            System.out.println(sum);
        }
    }

    private static boolean isleapyear(int year) {
        if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
            return true;
        return false;
    }

    //处理 一年的利润
    private static int getProfit(int from_year, int from_month, int from_day, int to_year, int to_month, int to_day) {
        int[] days = new int[]{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        int sum = 0;
        if(from_month==to_month) {//如果两个的月份相等 直接就是 日期相减
            if (to_month == 2 || to_month == 3 || to_month == 5 || to_month == 7 || to_month == 11)
                sum = sum + to_day - from_day + 1;
            else
                sum += (to_day - from_day + 1) * 2;
            return sum;
        }
        //对于 from_month 这一月来说 开始的天数可能不是1号
        if (from_month == 2 && isleapyear(from_year)) {
            //如果是闰2月
            sum = sum + 29 - from_day + 1;
        } else if (from_month == 2) {
            sum = sum + 28 - from_day + 1;
        } else if (from_month == 3 || from_month == 5 || from_month == 7 || from_month == 11)
            sum = sum + days[from_month] - from_day + 1;
        else
            sum += (days[from_month] - from_day + 1) * 2;

        //对于 to_month 这一月来说 结束的天数可能不是月底
        if (to_month == 2 || to_month == 3 || to_month == 5 || to_month == 7 || to_month == 11)
            sum = sum + to_day;
        else
            sum += to_day * 2;

        //处理中间完整的月份
        for (int i = from_month + 1; i < to_month ; i++) {
            if (i == 2 && isleapyear(from_year)) {//如果是闰2月
                sum += 29;
            } else if (i == 2) {
                sum = sum + 28;
            } else if (i == 3 || i == 5 || i == 7 || i == 11)
                sum = sum + days[i];
            else
                sum += days[i] * 2;

        }
        return sum;
    }
}

发表于 2022-09-13 21:23:29 回复(0)
这题给的测试案例有问题,有个2100年2月29日的日期,但是这年不是闰年
可以直接用LocalDate里的方法解决,代码如下
import java.util.Scanner;
import java.time.LocalDate;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextInt()) {// 注意,如果输入是多个测试用例,请通过while循环处理多个测试用例
            LocalDate start = LocalDate.of(in.nextInt(),in.nextInt(),in.nextInt());
            LocalDate end = LocalDate.of(in.nextInt(),in.nextInt(),in.nextInt());
            int money = 0;
            while(start.compareTo(end)<=0){
                int month = start.getMonthValue();
                if(month==2||month==3||month==5||month==7||month==11){
                    money+=1;
                }else{
                    money+=2;
                }
                start=start.plusDays(1);
            }
            System.out.println(money);
        }
    }
}



发表于 2022-06-01 17:07:37 回复(1)
import java.util.*;
public class Main{
    //判断是否是闰年
    public static boolean isLeapYear(int n){
        if((n % 4 == 0 && n % 100 != 0) || n % 400 == 0){
            return true;
        }
        return false;
    }
    //判断某一年一共有多少收益
    public static int profitofYear(int year){
        return 2 * 31
             + 1 * 28
             + 1 * 31
             + 2 * 30
             + 1 * 31
             + 2 * 30
             + 1 * 31
             + 2 * 31
             + 2 * 30
             + 2 * 31
             + 1 * 30
             + 2 * 31
             + (isLeapYear(year) ? 1 : 0);
    }
    //判断某一月是否是素数
    public static boolean isPrime(int month){
        return (month == 2 || month == 3 || month == 5 || month== 7 || month == 11);
    }
    //计算从year年的1月1号到year年的month月day号的收益
    public static int profitodThisyear(int year,int month,int day){
        int profit = 0;
        if(!isPrime(month)){
            profit = day * 2;
        }else{
            profit = day;
        }
        while (--month > 0) {
            switch (month) {
            case 1: case 8: case 10: case 12 :
                profit += 62;
                break;
            case 3: case 5: case 7:
                profit += 31;
                break;
            case 4 : case 6 : case 9:
                profit += 60;
                break;
            case 11:
                profit += 30;break;
            default: 
                profit += (28 + (isLeapYear(year) ? 1 : 0));
                break;
            }
        }
        return profit;
    }
    public static void main(String[] args){
        
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            int profit = 0;
            int year1 = sc.nextInt();
            int month1 = sc.nextInt();
            int day1 = sc.nextInt();
            int year2 = sc.nextInt();
            int month2 = sc.nextInt();
            int day2 = sc.nextInt();
            
            profit = profitofYear(year1) - profitodThisyear(year1,month1,day1 - 1);
            profit += profitodThisyear(year2,month2,day2);
            if(year1 == year2){
                profit -= profitofYear(year1);
            }
            for(int i = year1 + 1;i < year2;i++){
                profit += profitofYear(i);
            }
            System.out.println(profit);
        }
    }
}

发表于 2022-05-15 19:38:12 回复(0)
// write your code here
import java.util.*;
public class Main{
    //判断是否是闰年
    public static boolean isLeapYear(int year){
        return (year%4==0&&year%100!=0)||year%400==0;
    }
    //一整年的收益
    public static int profitYear(int year){
        return 2*31
            +1*28
            +1*31
            +2*30
            +1*31
            +2*30
            +1*31
            +2*31
            +2*30
            +2*31
            +1*30
            +2*31
            +(isLeapYear(year)?1:0);
    }
    //判断月份是否是素数
    public static boolean isPrime(int month){
        return month==2||month==3||month==5||month==7||month==11;
    }
    //本年具体日期的收益
    public static int profitThisyear(int year,int month,int day){
        int profit=0;
        if(isPrime(month)){
            profit=day;
        }else{
            profit=2*day;
        }
        while(--month>0){
            switch(month){
                case 1:case 8:case 10:case 12:
                    profit+=62;
                    break;
                case 3:case 5:case 7:
                    profit+=31;
                    break;
                case 4:case 6:case 9:
                    profit+=60;
                    break;
                case 11:
                    profit+=30;
                    break;
                default:
                    profit+=(28+(isLeapYear(year)?1:0));
                    break;
            }
        }
        return profit;
    }
    public static void main(String[]args){
        Scanner scanner=new Scanner(System.in);
        while(scanner.hasNext()){
            int profit=0;
            int startYear=scanner.nextInt();
            int startMonth=scanner.nextInt();
            int startDay=scanner.nextInt();
            int endYear=scanner.nextInt();
            int endMonth=scanner.nextInt();
            int endDay=scanner.nextInt();
            profit=profitYear(startYear)-profitThisyear(startYear,startMonth,startDay-1);
            profit+=profitThisyear(endYear,endMonth,endDay);
            if(startYear==endYear){//年份相同的情况
                profit-=profitYear(startYear);
            }
            for(int i=startYear+1;i<endYear;i++){
                profit+=profitYear(i);
            }
            System.out.println(profit);
        }
    }
}

编辑于 2022-05-12 14:07:50 回复(0)
import java.util.*;
public class Main{
    // 平年一年每个月份的收入
    static int[] moneyOfMonth = {62, 28, 31, 60, 31, 60, 31, 62, 60, 62, 30, 62};
    // 判断闰年
    public static boolean isLeap(int year){
        if(year % 400 == 0 || year % 4 == 0 && year % 100 != 0){
            return true;
        }
        return false;
    }
    // 判断素数月
    public static boolean isPrime(int month){
        if(month == 2 || month == 3 || month == 5 || month == 7 || month == 11) return true;
        return false;
    }
    // 计算完整一年的收入
    public static int moneyOfYear(int year){
        int ret = 0;
        for(int i = 0; i < moneyOfMonth.length; i++){
            ret += moneyOfMonth[i];
        }
        if(isLeap(year)){
            return ret+1;
        }
        return ret;
    }

    // 计算同年收入
    public static int moneyOfIncompleteYear(int[] from, int[] to){
        // 同月
        if(from[1] == to[1]){
            if(isPrime(from[1])){
                return to[2]-from[2]+1;
            }
            else{
                return 2*(to[2]-from[2]+1);
            }
        }
        int ret = 0;
        // 1.计算from月收入
        if(isPrime(from[1])){
            ret += moneyOfMonth[from[1]-1] - (from[2]-1);
        }
        else{
            ret += moneyOfMonth[from[1]-1] - 2*(from[2]-1);
        }
        if(from[1] == 2 && isLeap(from[0])) ret++;
        // 2.计算从from当月的下一月到to的前一月这几月完整的月收入
        for(int i = from[1]+1-1; i < to[1]-1; i++){
            ret += moneyOfMonth[i];
            if(i == 2 && isLeap(from[0])) ret++;
        }
        // 3.计算to月收入
        if(isPrime(to[1])){
            ret += to[2];
        }
        else{
            ret += 2*to[2];
        }
        return ret;
    }
    // 计算从from到to的收入
    public static int money(int[] from, int[] to){
        // 同年
        if(from[0] == to[0]){
            return moneyOfIncompleteYear(from, to);
        }
        int ret = 0;
        // 1.计算from当年的收入
        if(isPrime(from[1])){
            ret += moneyOfMonth[from[1]-1] - from[2]-1;
        }
        else{
            ret += moneyOfMonth[from[1]-1] - 2*(from[2]-1);
        }
        if(from[1] == 2 && isLeap(from[0])) ret++;
        for(int i = from[1]+1-1; i < 12; i++){//+1是因为要计算的后一个月的 -1是因为数组下标
            ret += moneyOfMonth[i];
            if(i == 1 && isLeap(from[0])) ret++;
        }
        // 2.计算从from当年的下一年到to的前一年这几年完整的年收入
        for(int i = from[0]+1; i < to[0]; i++){
            ret += moneyOfYear(i);
        }
        // 3.计算to当年收入
        for(int i = 0; i < to[1]-1; i++){
            ret += moneyOfMonth[i];
            if(i == 1 && isLeap(to[0])) ret++;
        }
        if(isPrime(to[1])){
            ret += to[2];
        }
        else{
            ret += 2*to[2];
        }
        return ret;
    }
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            int[] from = new int[3];
            for(int i = 0; i < 3; i++){
                from[i] = sc.nextInt();
            }
            int[] to = new int[3];
            for(int i = 0; i < 3; i++){
                to[i] = sc.nextInt();
            }
            int ret = money(from, to);
            System.out.println(ret);
        }
    }
}

发表于 2021-07-20 21:49:54 回复(0)