【Code Pratice】—— 第几天、K倍区间、煤球数量
文章目錄
- 1 | 第幾天
- 題目
- 思路
- 邏輯代碼
- 2 | K倍區間
- 題目
- 思路
- 邏輯代碼
- 3 | 煤球數目
- 題目
- 思路
- 邏輯代碼
1 | 第幾天
題目
y年m月d日是哪一年的第幾天。
比如y年的1月1日是那一年的第一天,那么2000年7月7日是那一年的第幾天。
思路
判斷日期是一年中的第幾天問題,實際就是一個邏輯加法運算,只需要從當年的一月一號開始計算,一直累加到給定的日期的天數即可,主要邏輯在于區分哪些月的總天數有多少,如哪些月有31天,哪些有30,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倍區間嗎?
輸入格式:
輸出格式:
輸出一個整數,代表K倍區間的數目。 example: 6思路
本題實質上是計算某幾個連續的數字的和是否等于k的倍數,連續的數字就說明是從頭到尾的遍歷則個數列,和就是從遍歷的第一個數字開始累加,k的倍數就是和的值是否等于n * k(n為正整數),所以按照這三個點得出思路
邏輯代碼
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層,共有多少個煤球?
思路
這是一道數學題,只要找出每一層的煤球數目的規律,再進行求和即可,如下
找每一項的規律
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
前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; }總結
以上是生活随笔為你收集整理的【Code Pratice】—— 第几天、K倍区间、煤球数量的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OSG系统的学习
- 下一篇: 直播平台开发直播特效的原理与难点