笔试强训day31(分解因数,美国节日)

目录

第一题-分解因数

第二题-美国节日


第一题-分解因数

 

思路:

        有两种情况,当输入的是素数时,那么此素数只有1和它本身,当输入的不是素数时,遍历寻找此数的素数,当遇到素数时,存起来并且将处理n

// write your code here cpp
#include<iostream>
#include<vector>
#include<math.h>
using namespace std;

void git_factor(int n, vector<int>& arr)
{
    //每次调用前要将容器清空
    arr.clear();
    for(int i = 2; i <= sqrt(n); ++i)
    {
        //遇到一个素数就将此数,存起来
        while(n%i == 0)
        {
            arr.push_back(i);
            n = n/i;
        }
    }
    //处理只有1和本身的素数
    if(n > 1)
    {
        arr.push_back(n);
    }
}

int main ()
{
    int n;
    vector<int> arr;
    while(cin>>n)
    {
        git_factor(n, arr);
        printf("%d = ", n);                 
        for(int i = 0; i < arr.size(); ++i)
        {
            printf("%d",arr[i]);
            if(i < arr.size()-1)
                printf(" * ");
        }
        printf("\n");
    }
    return 0;
}

第二题-美国节日

 

 

思路:

       

 闰年 = (year%100 != 0 && year%4 == 0 )||(year%400 == 0)

 

 总结:

 

// write your code here cpp
#include<iostream>
using namespace std;
//判断闰年
bool Isleepyear(int year)
{
    return (year%400 == 0)||((year%100!=0)&&(year%4 == 0));
}
int days[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
//计算今年过了多少天
int ndays(int year, int month, int day)
{
    int sum = day;
    for(int i = 1; i <= month-1; ++i)
    {
        sum += days[i];
    }
    //如果是闰年并且超过2月的话,会多一天
    if(month > 2 && Isleepyear(year))
        ++sum;
    return sum;
}

//从基准日期到现在过了多少天
//MOD7
int dif(int year, int month, int day)
{
    return (year-1)+(year-1)/4-(year-1)/100 + (year-1)/400+ndays(year, month, day);
}

//计算今天周几
int week(int year, int month, int day)
{
    int week = dif(year, month, day)%7;
    if(week == 0) week = 7;
    return week;
}
//已知当月一日是星期w,求出第n个星期e
int m1(int w, int n, int e)
{
    return 1+(n-1)*7 + (7-w+e)%7;
}
//一直6月1日是星期w,怎么找到五月的最后一个星期一
int m2(int w)
{
    int tmp = (w == 1 ? 7 : w-1);
    return 32-tmp;
}

//* 1月1日:元旦
void new_year_day(int year)
{
    printf("%d-01-01\n",year);
}
//* 1月的第三个星期一:马丁·路德·金纪念日
void martin_luther_king_day(int year)
{
    int w = week(year,1,1);
    printf("%d-01-%d\n",year, m1(w,3,1));
}
//* 2月的第三个星期一:总统节
void president_day(int year)
{
    int w = week(year, 2, 1);
    printf("%d-02-%02d\n", year, m1(w, 3, 1));
}
//* 5月的最后一个星期一:阵亡将士纪念日
void memorial_day(int year)
{
    int w = week(year, 6, 1);
    printf("%d-05-%02d\n", year, m2(w));
}
//* 7月4日:美国国庆
void independence_day(int year)
{
    printf("%d-07-04\n",year);
}
//* 9月的第一个星期一:劳动节
void labor_day(int year)
{
    int w = week(year, 9, 1);
    printf("%d-09-%02d\n",year, m1(w, 1, 1));
}
//* 11月的第四个星期四:感恩节
void thanks_giving_day(int year)
{
    int w = week(year, 11, 1);
    printf("%d-11-%02d\n",year, m1(w, 4,4));
}
//* 12月25日:圣诞节
void christmas(int year)
{
    printf("%d-12-25\n",year);
}


int main ()
{
    int year;
    while(cin>>year)
    {
        new_year_day(year);
        martin_luther_king_day(year);
        president_day(year);
        memorial_day(year);
        independence_day(year);
        labor_day(year);
        thanks_giving_day(year);
        christmas(year);
        cout<<endl;
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

penguin_bark

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

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

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

打赏作者

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

抵扣说明:

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

余额充值