20230325
上週作業檢討
盧冠綸 @ Sprout 2023
維吉尼亞的統計學
維吉尼亞的統計學
可參考的思路:
用 int 陣列來存要輸出的 26 個數字。
維吉尼亞的統計學
我要怎麼處理那個二維表格:
ㄧ、用 if else 處理所有組合。
慢,有 26 * 26 = 676 種組合
二、用 ASCII code 的運算。
快,也許很快就能寫好。
維吉尼亞的統計學
用 ASCII code 的運算要怎麼做?
=> 先來找規律:
'a' 和 'a' 得到 'a'
'a' 和 'b' 得到 'b'
'a' 和 'z' 得到 'z'
'b' 和 'a' 得到 'b'
'b' 和 'b' 得到 'c'
'b' 和 'z' 得到 'a'
感覺很像加法?
'a' 是 0,'b' 是 1,...
維吉尼亞的統計學
我要怎麼讓 'a' 是 0,'b' 是 1,...?
=> 把它減 'a'!
這樣子,我們就知道,
兩個字母,letter1 和 letter2,會合成什麼新字母了。
=> (letter1 - 'a') + (letter2 - 'a') (X
=> ((letter1 - 'a') + (letter2 - 'a')) % 26 (O
%26 是為了避免超出陣列範圍
#include <iostream>
#include <cstring>
int main(){
// a和b是輸入的兩個字串
char a[1005], b[1005];
std::cin >> a >> b;
unsigned long len = strlen(a);
// answer是要輸出的陣列,記得初始化!!
int answer[26] = {0};
for (unsigned long i=0 ; i<len ; i++){
int temp = (a[i] - 'a') + (b[i] - 'a');
answer[temp%26] += 1;
}
// 處理輸出 (最後不用空白&換行)
for (int i=0 ; i<25 ; i++){
std::cout << answer[i] << " ";
}
std::cout << answer[25];
}
答案:
維吉尼亞的統計學
高強度密碼
高強度密碼
以下是大致的架構:
#include <iostream>
#include <cstring>
int main(){
cin 密碼
cin 確認密碼
確認題目中的各個條件
if (條件全部達成){
std::cout << "Succeeded!" << std::endl;
}else{
std::cout << "Failed!" << std::endl;
}
}
高強度密碼
要輸出 Succeeded!,有那些條件?
密碼長度至少為 8 -> 用 strlen 處理
確認密碼和密碼一樣 -> 用 strcmp 處理
至少包含一個大寫字母 ->
至少包含一個小寫字母 -> 用迴圈手動找
至少包含一個數字 ->
高強度密碼
密碼長度至少為 8
確認密碼和密碼一樣
if (strlen(password) >= 8)
if (strcmp(password, password2) == 0)
一種思路:把題目的五個條件都用 bool 來存,
如果這五個條件都是 true 則註冊成功。
高強度密碼
int length = strlen(password);
for (int i=0 ; i<length ; i++){
if ((password[i] >= 'A') and (password[i] <= 'Z')){
// do something
}else if ((password[i] >= 'a') and (password[i] <= 'z')){
// do something
}else if ((password[i] >= '0') and (password[i] <= '9')){
// do something
}
}
至少包含一個大寫字母
至少包含一個小寫字母
至少包含一個數字
高強度密碼
以下是這一題的參考做法:(可下拉)
#include <iostream>
#include <cstring>
int main(){
// 輸入密碼和確認密碼
char password[1000005], examine[1000005];
std::cin >> password >> examine;
// 用五個 bool 存五個條件:長度、大寫、小寫、數字、確認密碼
bool len = false, A = false, a = false, one = false, same = false;
int length = strlen(password);
if (length >= 8){
len = true;
}
for (int i=0 ; i<length ; i++){
if ((password[i] >= 'A') and (password[i] <= 'Z')){
A = true;
}
if ((password[i] >= 'a') and (password[i] <= 'z')){
a = true;
}
if ((password[i] >= '0') and (password[i] <= '9')){
one = true;
}
}
if (strcmp(password, examine) == 0){
same = true;
}
// 如果五個條件都達成,就註冊成功,反之則失敗
if (len && A && a && one && same){
std::cout << "Succeeded!" << std::endl;
}else{
std::cout << "Failed!" << std::endl;
}
}
高強度密碼
大家比較常遇到的問題:
沒有給 '\0' 留位置:(testcase 9)
用 for 迴圈看驗證密碼,但未考量到長度問題:
(testcase 3 : 密碼 Sprout2023,
驗證密碼 Sprout20230318)
漏看了一些條件
把一些 && 跟 || 誤用
謝謝大家
20230325 上週作業檢討
By allen522019
20230325 上週作業檢討
- 230