1.第一题
1.1题目
描述:
NowCoder在淘宝上开了一家网店。他发现在月份为素数的时候,当月每天能赚1元;否则每天能赚2元。
现在给你一段时间区间,请你帮他计算总收益有多少。
输入描述:
输入包含多组数据。
每组数据包含两个日期from和to (2000-01-01 ≤ from ≤ to ≤ 2999-12-31)。
日期用三个正整数表示,用空格隔开:year month day。
输出描述:
对应每一组数据,输出在给定的日期范围(包含开始和结束日期)内能赚多少钱
1.2思路
- 把日期计算分为三个部分:第一个不足一年的年份,最后一个不足一年的年份,和中间的足年年份
- 足年年份我们只需要判断闰年后加365或366就行了
- 不足年,我们就要求出这个日期是这一年的第几天
- 本题中第一天也要算,所以还要加上这一天
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思路
- 求斐波那契数列在100000以内的每一项的后六位并存放在数组中
- 然后直接输出数组里的对应值即可
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);
}
}
}
}