文章目錄
- 1. 前言
- 2. JZ64 求1+2+3+...+n
- 2.1 題目分析
- 2.2 代碼
- 3. HJ73 計算日期到天數轉換
- 3.1 題目分析
- 3.2 代碼
- 4. KY222 打印日期
- 4.1 題目分析
- 4.2 代碼
1. 前言
下面兩個題目均來自牛客,使用的編程語言是c++,分享個人的一些思路和代碼。
2. JZ64 求1+2+3+…+n
2.1 題目分析
注意看題目描述,要求不能使用乘除法、for、while、if、else、switch、case等關鍵字及條件判斷語句。
按照之前的想法,可以用遞歸,循環,等差求和,但是這里都被限制了,那么該怎么辦呢?
那么就走構造函數,先定義一個Sum
類,其中包含兩個靜態變量。這兩個變量并不是屬于這個某個對象,而是屬于整個類。
在構造函數里面走靜態變量,每次加等_i,再讓_i加加。
現在就存在一個問題,怎么讓Sum調用n次?
那就構造n個對象就可以了,用數組來構造就行。
要拿到最后的結果,還得再寫一個成員函數來返回最后得到的_ret值,因為是再整個類中,所以使用static
修飾。
這樣就通過了。
2.2 代碼
class Sum
{private:static int _i;static int _ret;public:Sum(){_ret+=_i;_i++;}static int GetRet(){return _ret;}};
int Sum::_i=1;
int Sum::_ret=0;
class Solution {
public:int Sum_Solution(int n) {Sum s[n];return Sum::GetRet(); }
};
3. HJ73 計算日期到天數轉換
3.1 題目分析
題目要求根據輸入的日期,計算是這一年的第幾天。
我們會直接想到把每個月的天數直接相加就行,但是前提是得知道每個月有多少天,而2月份在閏年是29,所以得先判斷一下是不是閏年。
就先寫一個函數來判斷是不是閏年,如果是就返回true,不是就返回false。
bool is_is_Leapyear(int year) {if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {return true;}else {return false;}
}
要直接相加對應月的天數,直接寫一個數組來表示每個月有多少天,讓對應的下標就是對應的月。
int monthDays[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
在設計求和的時候會出現把當月的天數直接相加的,但是會存在這個月并不是剛好是最后一天,所以得事先將求和的變量直接定義成那個月所對應的天 int sum = d;
在實現相加之前可以先判斷是不是閏年而且月份必須大于2月份,相加的時候才會先多加1。
再讓月份減減,實現每個月對應的都相加上,最后將總和的天數sum輸出就行。
3.2 代碼
#include <iostream>
using namespace std;bool is_Leapyear(int year) {if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {return true;}else {return false;}
}int main() {int y, m, d;int monthDays[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };cin >> y >> m >> d;// 注意 while 處理多個 caseint sum = d;if (is_is_Leapyear(y)) {if (m > 2) {sum = sum + 1;}}while (m) {m--;sum += monthDays[m];}cout << sum << endl;
}
4. KY222 打印日期
4.1 題目分析
這里與上面的計算日期到天數轉換類似,不過這里是給定天數來計算日期。
同樣先寫一個判斷是不是閏年的函數。
這里因為要用到減,所以先定義兩個數組,一個是閏年的,一個不是。
int monthDays[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };int monthDays_[12] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
我們了解到月份中最小的是2月份,最少是28天,可以作為循環的條件。
但是得注意,如果事先給的日期小于28,并不是0月,而是1月,這里就得在定義月份的時候直接先定為1,int m = 1;
。
在減對應月份的日期時候得注意判斷條件,必須是那個月份對應的日期,而且閏年與平年還是不一樣的,所以這里是這樣寫的。
if (is_Bisseextile(y)){if (d > monthDays_[m-1]){d = d - monthDays_[m-1];}elsebreak;}else if(d > monthDays[m-1]){d = d - monthDays[m-1 ];}
注意題目最后的打印,它格式是有要求的
所以這里的打印得這樣寫:
printf("%04d-%02d-%02d\n", y, m, d);
4.2 代碼
#include <iostream>
using namespace std;bool is_Bisseextile(int year) {if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {return true;}else {return false;}
}int main() {int y, d;int monthDays[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };int monthDays_[12] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };while (cin >> y >> d) {// 注意 while 處理多個 caseint m = 1;while (d > 28){if (is_Bisseextile(y)){if (d > monthDays_[m-1]){d = d - monthDays_[m-1];}elsebreak;}else if(d > monthDays[m-1]){d = d - monthDays[m-1 ];}m++;}printf("%04d-%02d-%02d\n", y, m, d);}
}
有問題請指出,大家一起進步吧!!!