笔试强训day32(淘宝网店,斐波那契凤尾)

目录

第一题-淘宝网店

第二题-斐波那契凤尾


第一题-淘宝网店

思路:

        首先判断同一个月中天数的差异,同一年中月份的差异,不同年份差异,总共有9种情况,分开来讨论

// write your code here cpp
#include<iostream>
using namespace std;
//非闰年每月天数
int days[]={0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
//非闰年每月的收益
int mony[]={0, 62, 28, 31, 60, 31, 60, 31, 62, 60, 62, 30, 62};
//判断素数
bool Is_prime(int n)
{
    if(n == 2 || n == 3 || n == 5 || n == 7 || n == 11)
        return true;
    return false;
}
//判断闰年
bool Is_leapyear(int year)
{
    return (year%400 == 0)||((year%4 == 0)&&(year%100 != 0));
}
//day2-day1收益
int daymony(int day1, int day2, int month)
{
    int sum = day2-day1+1;
    if(!Is_prime(month))
        sum*=2;
    return sum;
}
//month2-mnoth1收益,包括month1和month2
int monthmony(int month1, int month2, int year)
{
    int sum=0;
    for(int i = month1; i <= month2; ++i)
    {
        sum+=mony[i];
        if(Is_leapyear(year)&&i == 2)
            ++sum;
    }
    return sum;
}
//year2-year1收益.包括year1和year2
int yearmony(int year1, int year2)
{
    int sum=0;
    for(int i = year1; i <= year2; ++i)
    {
        sum+=monthmony(1,12,i);
    }
    return sum;
}
int main ()
{
    int year1, month1, day1, year2, month2, day2;
    while(cin>>year1>>month1>>day1>>year2>>month2>>day2)
    {
        int count=0;
        //同年
        if(year1==year2)
        {
            //同月
            if(month1 == month2)
            {
                count+=daymony(day1, day2, month1);
            }
            //不同月份
            else
            {
                //计算month1的当月收益
                count+=daymony(day1, days[month1], month1);
                //计算month2的当月收益
                count+=daymony(1, day2, month2);
                //计算两者的相差月份的收益
                count+=monthmony(month1, month2, year1);
            }
        }
        else
        {
            //不同年
            //计算相差年份的收益
            count+=yearmony(year1+1,year2-1);
            //计算开始的头一年和结束的最后一年里,所有月份的收益
            count+=monthmony(month1+1, 12, year1);
            count+=monthmony(1, month2-1,year2);
            //计算当月不满的收益
            count+=daymony(day1, days[month1],month1);
            count+=daymony(1, day2, month2);
        }
        cout<<count<<endl;
    }
    return 0;
}

第二题-斐波那契凤尾

 

思路:

        值得注意的是,牺牲空间换取时间,首先先定义好斐波那契数并计算,然后记录斐波那契额中大于1000000的数据,当超过六位则取后六位输出,当小于六位直接输出即可

#include <iostream>
#include <vector>
using namespace std;
int main(){
    vector<int> F(100001, 0);
    F[0] = 1;
    F[1] = 1;
    //提前计算斐波那契数列,只保留后6位
    for(int i = 2; i <= 100000; ++i){
        F[i] = F[i - 2] + F[i - 1];
        F[i] = F[i] % 1000000;//由于是相加,所以只要后六位不影响下一个数的结果
    }
    int n;
    while(cin >> n){
        if(n < 29){
            //斐波那契数列小于6位
            printf("%d\n", F[n]);
        }
        else{
            printf("%06d\n", F[n]);
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

penguin_bark

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值