【Code Pratice】—— 第几天、K倍区间、煤球数量

1 | 第几天

题目

y年m月d日是哪一年的第几天。
比如y年的1月1日是那一年的第一天,那么2000年7月7日是那一年的第几天。

思路

判断日期是一年中的第几天问题,实际就是一个逻辑加法运算,只需要从当年的一月一号开始计算,一直累加到给定的日期的天数即可,主要逻辑在于区分哪些月的总天数有多少,如哪些月有31天,哪些有30,2月有几天,思路如下

  1. 首先判断日期年份是闰年还是平年,以决定二月份的准确天数
  2. 从一月一号开始累加,一直累加到给定的日期

逻辑代码

int WhatDay(int i_uYear, int i_uMonth, int i_uDay)
{
    int sum = 0;
    // 入口保护
    if (!IsValidDate(i_uYear, i_uMonth, i_uDay))
    {
        return sum;
    }
    int FebruaryDays = 28;

    // 判断是闰年还是平年
    if (IsLeapYear(i_uYear))
    {
        FebruaryDays = 29;
    }

    // 天数累加计算
    for (int i = 1; i <= i_uMonth; i++)
    {
        if (i_uMonth == i)
        {
            sum += i_uDay;
        }
        else
        {
            if (2 == i)
            {
                sum += FebruaryDays;
            }
            // 判断是不是有31天的月份
            else if (IsBigMonth(i))
            {
                sum += 31;
            }
            else 
            {
                sum += 30;
            }
        }
    }
    return sum;
}

2 | K倍区间

题目

给定一个长度为N的数列,A1, A2, … AN,如果其中一段连续的子序列Ai, Ai+1, … Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间。
你能求出数列中总共有多少个K倍区间吗?
输入格式:

第一行包含两个整数N和K。(1 <= N, K <= 100000)
第二行包含N个整数Ai。(1 <= Ai <= 100000)
example:
5 2
1 2 3 4 5

输出格式:

输出一个整数,代表K倍区间的数目。
example:
6

思路

本题实质上是计算某几个连续的数字的和是否等于k的倍数,连续的数字就说明是从头到尾的遍历则个数列,就是从遍历的第一个数字开始累加,k的倍数就是的值是否等于n * k(n为正整数),所以按照这三个点得出思路

  1. 选择第一个元素作为火车头,从头开始遍历当前数列
  2. 计算当前遍历过的所有数字的和
  3. 对比计算的和是否等于k的倍数
  4. 选择下一个元素作为火车头,重复执行1, 2, 3步骤,直到选择到最后一个元素为止

逻辑代码

int KTimesInterval(vector<int>& i_uArr, int i_uN, int i_uK)
{
    int res = -1;
    if (i_uN != i_uArr.size())
    {
        return res;
    }

    res = 0;
    for (int i = 0; i < i_uN; i++)
    {
        int sum = 0;
        for (int j = i; j < i_uN; j++)
        {
            sum += i_uArr[j];
            if (0 == sum % i_uK)
            {
                res++;
            }
        }
    }
    return res;
}

3 | 煤球数目

题目

有一堆煤球,堆成三角棱锥形。具体:
第一层放1个,
第二层3个(排列成三角形),
第三层6个(排列成三角形),
第四层10个(排列成三角形),

    *
   ***
  ******
**********

如果一共有100层,共有多少个煤球?

思路

这是一道数学题,只要找出每一层的煤球数目的规律,再进行求和即可,如下

  1. 找每一项的规律
    3 - 1 = 2
    6 - 3 = 3
    10 - 6 = 4
    ……
    A(n-1) - A(n-2) = n - 1
    A(n) - A(n-1) = n
    以上每个式子相加 --> A(n) - A(n-1) + A(n-1) + A(n-2) + …… + A(3) - A(2) + A(2) - A(1)
    A(n) = n * (n + 1) / 2

  2. 前n项求和
    Sn = A(n) + A(n-1) + …… + 10 + 6 + 3 + 1 = (n^3 + 3*n^2 + 2n) / 6
    所以前一百层煤球总数等于求前100项和S(100)

逻辑代码

int NumberOfBriquettes(int i_uNum)
{
    int res = 0;
    if (0 > i_uNum)
    {
        return res;
    }

    res = ((i_uNum * i_uNum * i_uNum) + (3 * i_uNum * i_uNum) + (2 * i_uNum)) / 6;
    return res;
}

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Ltd Pikashu

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

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

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

打赏作者

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

抵扣说明:

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

余额充值