day32—编程题

1.第一题

1.1题目

描述:
NowCoder在淘宝上开了一家网店。他发现在月份为素数的时候,当月每天能赚1元;否则每天能赚2元。
现在给你一段时间区间,请你帮他计算总收益有多少。
输入描述:
输入包含多组数据。
每组数据包含两个日期from和to (2000-01-01 ≤ from ≤ to ≤ 2999-12-31)。
日期用三个正整数表示,用空格隔开:year month day。
输出描述:
对应每一组数据,输出在给定的日期范围(包含开始和结束日期)内能赚多少钱

1.2思路

  1. 把日期计算分为三个部分:第一个不足一年的年份,最后一个不足一年的年份,和中间的足年年份
  2. 足年年份我们只需要判断闰年后加365或366就行了
  3. 不足年,我们就要求出这个日期是这一年的第几天
  4. 本题中第一天也要算,所以还要加上这一天

1.3解题

import java.util.*;
public class Main {
    //判断是不是闰年
    public static boolean isLeapYear(int y){
        return (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0);
    }
    //计算一年的收益
    public static int ySum(int y){
        // 不是素数:1 4 6 8 9 10 12;素数:2 3 5 7 11
        return 2 * (31 * 4 + 30 * 3) + (28 + 31 * 3 + 30) + (isLeapYear(y) ? 1 : 0);
    }
    //计算该月是不是素数
    public static boolean isPrime(int m){
        return m == 2 || m == 3 || m == 5 || m == 7 || m == 11;
    }
    //计算给定年月日的当前年份的收入
    public static int curYSum(int y,int m,int d){
        int sum = 0;
        if(isPrime(m)){
            sum = d;
        }else{
            sum = d * 2;
        }
        while (--m > 0){
            switch(m){
                // 该月不是素数且是31天
                case 1 : case 8 : case 10 : case 12:
                sum += 62;
                break;
                // 该月是素数但是是31天
                case 3 : case 5 : case 7:
                sum += 31;
                break;
                // 该月不素数且是30天
                case 4 : case 6 : case 9:
                sum += 60;
                break;
                // 该月是素数且是30天
                case 11:
                sum += 30;
                break;
                default:
                sum += 28 + (isLeapYear(y) ? 1 : 0);
                break;
            }
        }
        return sum;
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNextInt()) { 
            int y1 = sc.nextInt();
            int m1 = sc.nextInt();
            int d1 = sc.nextInt();
            int y2 = sc.nextInt();
            int m2 = sc.nextInt();
            int d2 = sc.nextInt();
            //计算起始年份的剩下时间的收入
            int sum = ySum(y1) - curYSum(y1,m1,d1 - 1);
            //计算终止年份的收入
            sum += curYSum(y2,m2,d2);
            //如果起始年份和终止年份是同一年,就减去剩下时间的收入
            if(y1 == y2){
                sum -= ySum(y1);
            }
            //计算整年的收益
            for(int i = y1 + 1; i < y2;i++){
                sum += ySum(i);
            }
            System.out.println(sum);
        }
    }
}

2.第二题

2.1题目

描述:
NowCoder号称自己已经记住了1-100000之间所有的斐波那契数,为了考验他,我们随便出一个数n,让他说出第n个斐波那契数。当然,斐波那契数会很大。因此,如果第n个斐波那契数不到6位,则说出该数;否则只说出最后6位
输入描述:
输入有多组数据。
每组数据一行,包含一个整数n (1≤n≤100000)
输出描述:
对应每一组输入,输出第n个斐波那契数的最后6位

2.2思路

  1. 求斐波那契数列在100000以内的每一项的后六位并存放在数组中
  2. 然后直接输出数组里的对应值即可

2.3解题

import java.util.*;
public class Main {
    public static void main(String[] args) {
        int flg = -1;//记录斐波那契数大于六位数的位置
        long[] arr = new long[100000];
        arr[0] = 1;
        arr[1] = 2;
        for(int i = 2;i < arr.length;i++){
            long next = arr[i - 1] + arr[i - 2];
            // 找到斐波那契数大于六位数的位置
            if(flg == -1 && next >= 1000000){
                flg = i + 1;
            }
            //只取后六位
            arr[i] = next % 1000000;
        }
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            int n = sc.nextInt();
            long m = arr[n - 1];
            if(n < flg){
                //斐波那契数没有超过六位数的输出
                System.out.printf("%d\n",m);
            }else{
                //斐波那契数超过六位数的输出
                System.out.printf("%06d\n",m);
            }
        }
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值