> 文章列表 > day32—编程题

day32—编程题

day32—编程题

文章目录

  • 1.第一题
    • 1.1题目
    • 1.2思路
    • 1.3解题
  • 2.第二题
    • 2.1题目
    • 2.2思路
    • 2.3解题

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 11return 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);}}}
}