《淘宝网店》:计算总收益

news2025/1/16 1:33:10

目录

一、题目

二、思路

 1、当两个年份不一样的时候

(1)from年剩余之后的收益

(2)中间年份的全部收益

(3)to年有的收益

2、同一个年份

三、代码

详细注释版本: 

简化注释版本:


 

一、题目

淘宝网店     题目链接:淘宝网店

NowCoder在淘宝上开了一家网店。他发现在月份为素数的时候,当月每天能赚1元;否则每天能赚2元。现在给你一段时间区间,请你帮他计算总收益有多少。

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

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

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

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

二、思路

        最主要的是计算两个日期之间的月份数以及判断素数的问题。 

 1、当两个年份不一样的时候

就有公式:

收益 = 2001年剩余之后的收益 + [2002,2021]全部收益 + 2022年有的收益 

(1)from年剩余之后的收益

        可以用 整年的收益 - 开始月日之前的收益。 

        因为每年就12个月,所以是素数的月份是固定的 :2、 3 、 5、 7、 11 。只有这5个月份是素数,每天挣一块钱。其他月份都是每天挣两块钱。

        同时要注意闰年的问题:闰年的2月份会多一天,所以多挣两块钱。

(2)中间年份的全部收益

        注意是闰年还是平年,计算整体收益。

(3)to年有的收益

        to年有的收益,就是当前年月日之前的收益。

但是要判断月份是素数还是合数,进行运算。

最后整体相加即可。

2、同一个年份

        在同一个年中,计算收益。

假设是 2001-4-5 到 2001-8-18 的收益。利用我们上面的方法函数进行计算。

三、代码

         在实际写代码中还有很多地方是需要注意的(在代码注释中):

  • 月份是否是素数判断;
  • 闰年的处理;
  • 计算from之前的收益时,要注意传入参数 fromDa - 1 ;

         两个主要方法:

  • yearSum(int y):计算整年的收益
  • beforeSum(int y,int m,int d):计算指定日期在本年的收益。(月日之前的收益)

详细注释版本: 

import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description:淘宝网店
 * User: WangWZ
 * Date: 2023-04-12
 * Time: 19:13
 */
public class Main {
    //判断是否是闰年
    private static boolean isLeapYear(int y) {
        return ((y % 400 == 0) || (y % 4 == 0 && y % 100 != 0));
    }
    //判断当前月数是否是素数
    private static boolean isPrime(int m) {
        if(m == 2 || m == 3 || m == 5 || m == 7 || m == 11) {
            return true;
        } else {
            return false;
        }
    }
    //整年全部的收益
    private static int yearSum(int y) {
        //2、3、5、7、11是素数月,所以每天只挣一块钱
        //其他都是每天挣两块钱
        //最后再判断是否是闰年,是闰年就+1(2月多挣一天)
        int sum =  31 * 2 + 28 * 1 + 31 * 1 + 30 * 2 +
                31 * 1 + 30 * 2 + 31 * 1 + 31 * 2 +
                30 * 2 + 31 * 2 + 30 * 1 + 31 * 2;
        if(isLeapYear(y)) {
            sum += 1;
        }
        return sum;
    }
    //指定日期之前的收益
    private static int beforeSum(int y,int m,int d) {
        //要判断这个月是素数还是合数
        //从当前月份向前累加
        int sum = 0;
        //1.先加当前月的没有过完整个月的天数的收益
        if(isPrime(m)) {
            sum += d * 1;
        } else {
            sum += d * 2;
        }
        //2.循环判断之前过完的月份是否是素数,并进行收益累加
        //注意不能加当前月份,因为这个月还没过完
        m--;
        while(m > 0) {
            switch(m){
                case 1 :case 8: case 10: case 12:
                    sum += 31 * 2;
                    break;
                case 2 :
                    sum += (isLeapYear(y)?29:28);
                    break;
                case 3 :case 5: case 7:
                    sum += 31 * 1;
                    break;
                case 4: case 6: case 9:
                    sum += 30 * 2;
                    break;
                case 11:
                    sum += 30 * 1;
                    break;
            }
            m--;
        }
        return sum;
    }
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNextInt()) {
            int fromYear = scanner.nextInt();
            int fromMo = scanner.nextInt();
            int fromDa = scanner.nextInt();
            int toYear = scanner.nextInt();
            int toMo = scanner.nextInt();
            int toDa = scanner.nextInt();
            //总收益 = form剩余的收益 + 中间年份的收益 + to之前的收益
            //from剩余的收益 = fromYear的全部收益 - from之前的收益
            //这里注意:
            //在算from之前的收益时,要 - 1。
            //因为fromDa这一天是我们要计算收益的,因此不能减掉。
            int n1 = yearSum(fromYear) - beforeSum(fromYear,fromMo,fromDa - 1);
            //中间年份的收益:循环加中间年分的收益
            int n2 = 0;
            for(int i = fromYear+1; i < toYear; i++) {
                n2 += yearSum(i);
            }
            //to之前的收益
            int n3 = beforeSum(toYear,toMo,toDa);
            //总收益sum
            //这里因为不管什么情况都要加上n1和n3,所以可以直接定义sum时候就加上
            //sum = n1 + n3;
            int sum = 0;
            if(fromYear == toYear) {
                sum = n1 + n3 - yearSum(fromYear);
            } else {
                sum = n1 + n2 + n3;
            }
            System.out.println(sum);

        }
    }
}

简化注释版本:

import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description:淘宝网店
 * User: WangWZ
 * Date: 2023-04-12
 * Time: 19:13
 */
public class Main {
    //判断是否是闰年
    private static boolean isLeapYear(int y) {
        return ((y % 400 == 0) || (y % 4 == 0 && y % 100 != 0));
    }
    //判断当前月数是否是素数
    private static boolean isPrime(int m) {
        if(m == 2 || m == 3 || m == 5 || m == 7 || m == 11) {
            return true;
        } else {
            return false;
        }
    }
    //整年全部的收益
    private static int yearSum(int y) {
        int sum =  31 * 2 + 28 * 1 + 31 * 1 + 30 * 2 +
                31 * 1 + 30 * 2 + 31 * 1 + 31 * 2 +
                30 * 2 + 31 * 2 + 30 * 1 + 31 * 2;
        if(isLeapYear(y)) {
            sum += 1;
        }
        return sum;
    }
    //指定日期之前的收益
    private static int beforeSum(int y,int m,int d) {
        int sum = 0;
        //1.先加当前月的没有过完整个月的天数的收益
        if(isPrime(m)) {
            sum += d * 1;
        } else {
            sum += d * 2;
        }
        //2.循环判断之前过完的月份是否是素数,并进行收益累加
        m--;
        while(m > 0) {
            switch(m){
                case 1 :case 8: case 10: case 12:
                    sum += 31 * 2;
                    break;
                case 2 :
                    sum += (isLeapYear(y)?29:28);
                    break;
                case 3 :case 5: case 7:
                    sum += 31 * 1;
                    break;
                case 4: case 6: case 9:
                    sum += 30 * 2;
                    break;
                case 11:
                    sum += 30 * 1;
                    break;
            }
            m--;
        }
        return sum;
    }
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNextInt()) {
            int fromYear = scanner.nextInt();
            int fromMo = scanner.nextInt();
            int fromDa = scanner.nextInt();
            int toYear = scanner.nextInt();
            int toMo = scanner.nextInt();
            int toDa = scanner.nextInt();
            //from剩余的收益 = fromYear的全部收益 - from之前的收益
            int n1 = yearSum(fromYear) - beforeSum(fromYear,fromMo,fromDa - 1);
            //中间年份的收益:循环加中间年分的收益
            int n2 = 0;
            for(int i = fromYear+1; i < toYear; i++) {
                n2 += yearSum(i);
            }
            //to之前的收益
            int n3 = beforeSum(toYear,toMo,toDa);
            //总收益sum
            int sum = 0;
            if(fromYear == toYear) {
                sum = n1 + n3 - yearSum(fromYear);
            } else {
                sum = n1 + n2 + n3;
            }
            System.out.println(sum);

        }
    }
}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/415752.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RC滤波器

前阶段&#xff0c;因项目解干扰问题&#xff0c;和同事聊起来RC滤波。所以&#xff0c;今日借此机会&#xff0c;通过文章的方式再一次给大家简单的普及一下RC滤波的知识。 关于滤波&#xff0c;其目的还是为了尽可能多的让有用信号做到无衰减&#xff0c;无用信号衰减至近乎…

云南计算机专升本经验分享

一、概述 经验分享 越早准备越好&#xff0c;切勿过分迷信同学的学习进度。 英语(97) 在云南专升本里面&#xff0c;英语在90以上已经是不错了&#xff0c;我由于自身基础不好原因&#xff0c;导致我刚开始一度想放弃英语&#xff0c;所以对英语的学习也是极尽节俭&#xff0…

Python每日一练(20230416)

目录 1. 有效数字 &#x1f31f;&#x1f31f;&#x1f31f; 2. 二叉树的最大深度 &#x1f31f; 3. 单词搜索 &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 …

【RabbitMQ】图解RabbitMQ是如何保证消息可靠性的

目录 一、概述 1、消息可靠性 2、SpringBoot整合RabbitMQ配置文件 二、生产者---RabbitMQ服务器如何保证信息不丢失 1、confirm确认模式 1.说明 2.SpringBoot代码实现 2、return退回模式 1.说明 2.SpringBoot代码实现 三、RabbitMQ服务器如何保证消息不丢失 四、Ra…

Logstash:使用自定义正则表达式模式

有时 Logstash Grok 没有我们需要的模式。 幸运的是我们有正则表达式库&#xff1a;Oniguruma。在很多时候&#xff0c;如果 Logstash 所提供的正则表达不能满足我们的需求&#xff0c;我们选用定制自己的表达式。 定义 Logstash 是一种服务器端数据处理管道&#xff0c;可同时…

zabbix客户端配置

一、zabbix客户端配置 1.实验环境&#xff1a;关闭防火墙和安全模块 systemctl disable --now firewalld setenforce 0 2.服务端和客户端都要时间同步 yum install -y ntpdate #注意安装需要用网络源安装&#xff0c;不能用本地源 ntpda…

电子器件系列34:tvs二极管(2)

一、基本原理&#xff1a; 二、重要产数&#xff1a; 不同的资料对于相同的参数可能有不同的命名&#xff0c;要根据实际情况来确定参数的意义 这里以上图表格里的参数名称进行解析&#xff0c;以其他资料作为参考。 结合图表和伏安特性曲线&#xff0c;再结合下面的图我是…

你认为的.NET数据库连接池,真的是全部吗?

一般我们的项目中会使用1到2个数据库连接配置&#xff0c;同程艺龙的数据库连接被收拢到配置中心&#xff0c;由DBA统一配置和维护&#xff0c;业务方通过某个字符串配置拿到的是开箱即用的Connection对象。 DBA能在对业务方无侵入的情况下&#xff0c;让大规模微服务实例切换…

第二周P9-P22

文章目录第三章 系统总线3.1、总线的基本概念一、为什么要用总线二、什么是总线三、总线上信息的传送四、总线结构的计算机举例1、单总线结构框图2、面向CPU的双总线结构框图3、以存储器为中心的双总线结构图3.2、总线的分类1、片内总线2、系统总线3、通信走线3.3、总线特性及性…

基于多目标粒子群优化算法的计及光伏波动性的主动配电网有功无功协调优化(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Vivado中ILA(集成逻辑分析仪)的使用

Vivado中ILA&#xff08;集成逻辑分析仪&#xff09;的使用一、写在前面二、ILA(Integrated Logic Analyzer)的使用2.1 ILA查找2.2 ILA配置2.2.1 General Options2.2.2 Probe Ports三、ILA调用四、ILA联调4.1 信号窗口4.2 波形窗口4.3 状态窗口4.4 设置窗口4.5 触发条件设置窗口…

Segment Anything论文详解(SAM)

论文名称&#xff1a;Segment Anything 论文地址&#xff1a;https://arxiv.org/abs/2304.02643 开源地址&#xff1a;https://github.com/facebookresearch/segment-anything demo地址&#xff1a;Segment Anything | Meta AI 主要贡献&#xff1a;开发一个可提示的图像分…

6.Java数组

数组 一、数组概述 1、什么是数组&#xff1f; 数组是相同类型数据的有序集合。数组描述的是相同类型的若干个数据&#xff0c;按照一定的先后次序排列组合而成。其中&#xff0c;每一个数据称作一个元素&#xff0c;每个元素可以通过一个索引(下标)来访问它们。 2、数组的…

哈夫曼树和最小生成树

哈夫曼树 首先给我们一串权值&#xff0c;然后我们需要让这串权值组成一个树&#xff0c;然后当他的wpl最小 我们可以发现当他的小权值离根节点越远&#xff0c;大权值离根节点越近的时候&#xff0c;我们这个时候构建出来的树就是wpl最小的树&#xff0c;也就是我们说的哈夫曼…

c++之 类和对象

目录 1.类和对象的基本概念 1.c语言与c中的结构体 2.类的封装性 3.定义类 4.构造与析构 构造与析构的概念&#xff1a; 构造函数 析构函数 拷贝构造函数 c默认增加的函数 1.类和对象的基本概念 1.c语言与c中的结构体 我们知道在c语言里&#xff0c;我们是无法在结构体…

进程的开销比线程大在了哪里?

进程内部都有哪些数据&#xff1f; 为什么创建进程的成本很高&#xff1f; 这样的问题确实不好回答&#xff0c;除非你真正理解了进程和线程的原理&#xff0c;否则很容易掉入面试大坑。探究问题背后的原理&#xff0c;围绕面试题展开理论与实践知识的学习。真正理解进程和线…

centos7虚拟机下hbase的使用案例讲解

系列文章目录 centos7虚拟机在集群zookeeper上面配置hbase的具体操作步骤 centos7虚拟机配置集群时间同步的操作步骤_centos虚拟机时间同步 centos7配置zookeeper本地模式与集群模式的详细教程 卸载centos7自带的jdk的操作步骤_centos7 卸载java 虚拟机centos7配置Hadoop单…

如何用 Vitis HLS 实现 OpenCV 仿真

这篇文章的基础是《Windows上快速部署Vitis HLS OpenCV仿真库》&#xff0c;我们使用的版本是Vitis HLS 2022.2&#xff0c;其他版本BUG不清楚&#xff0c;目前已知2021版本有BUG&#xff0c;只能使用其他方式&#xff0c;本文不适合。 这次选择中值滤波这个常规算法作为演示算…

Springboot电脑商城项目

目录 系统概述与环境搭建 1 系统开发及运行环境 2 项目分析 3 创建数据库 4 创建Spring Initializr项目 5 配置并运行项目 6 导入前端项目 用户注册 1 用户-创建数据表 2 用户-创建实体类 3 用户-注册-持久层 4 用户-注册-业务层 5 用户-注册-控制器 6 用户-注册…

归并排序(递归实现)

上一次我们说了快排的其他版本&#xff0c;还有就是快排的非递归实现 这次我们就说一哈归并排序&#xff0c;归并排序也是很厉害的一种排序&#xff0c;而且归并排序的时间复杂度可以说成标准的O(n log n) 下面我们就来看一下归并排序 我们先来看一下什么是归并排序 假设我…