阿摩線上測驗 登入

申論題資訊

試卷:111年 - 111 高等考試_三級_資訊處理:程式設計#109802
科目:程式設計
年份:111年
排序:0

申論題內容

三、請使用 C, C++, Java 或 Python 程式語言撰寫採用五位數整數來進行資料
加密的完整程式。
1.撰寫加密函數 encrypt(),此函數可將所傳入的五位數整數進行加密,
並將加密後的密碼傳回。加密的規則如下:
62ddee2e7ce45.jpg 先將該五位數整數的每位數值分別以「加 5 後除以 10 之餘數」取代。
62ddee363f214.jpg 再將取代後之數字的第一位數與第五位數互換,第二位數與第四位數互換,第三位數不變後取得一個新整數,此即為加密後的密碼。 (註:第一位數為萬分位、第二位數為千分位,以此類推。)
2.撰寫解密函數 decipher(),此函數可將所傳入的五位數密碼進行解密,並將解密後的整數傳回。解密的規則是將上述加密後之密碼還原為原傳入的整數。
3.撰寫主程式來驗證上述之加密與解密函數的正確性。程式一開始先讓使用者輸入任一之五位數整數[不在合理範圍內(10000~99999)須請使用者重新輸入],在呼叫加密函數後將所傳回之密碼從螢幕上顯示
出;再將該密碼傳入解密函數,再將所傳回之整數從螢幕上顯示出。程式須可讓使用者持續輸入五位數之整數,直到使用者輸入 0(整數)時結束程式的執行。

以下為程式執行的範例: (備註:斜體加外框線之整數為使用者所輸入,其餘皆為程式執行的輸出。)
請輸入一個五位數的整數(輸入 0 結束程式):1234
所輸入的數值並不是五位數之整數
請重新輸入:12345
加密後的密碼為:09876
解密後的密碼為:12345
請輸入一個五位數的整數(輸入 0 結束程式):67890
加密後的密碼為:54321
解密後的密碼為:67890
請輸入一個五位數的整數(輸入 0 結束程式):0
感謝使用此程式,歡迎您對此程式的優化提出建議。

詳解 (共 2 筆)

詳解 提供者:Fourier
看了其他題目並無限制資料型態,提供一種使用string的方法供大家參考,有錯誤請指教:
 
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
 
string encrypt(string num){
    string temp="";
    for(char c:num){
        int tempnum=c-'0';
        tempnum=(tempnum+5)%10;
        temp+='0'+tempnum;
    }
    return string(temp.rbegin(),temp.rend());
}
string decipher(string num){
    string temp=string(num.rbegin(),num.rend());
    string result="";
    for(char c:temp){
        result+='0'+abs((c-'5'));
    }
    return result;
}
 
int main(){
    string num;
    cout<<"請輸入一個五位數的整數(輸入 0 結束程式):";
    while(getline(cin,num)){
        if(num=="0") break;
        if(num.length()!=5 || !all_of(num.begin(),num.end(),::isdigit)){  //因為輸入string所以需要檢查是不是全為整數
            cout<<"所輸入的數值並不是五位數之整數"<<endl;
        }else {
            string enc=encrypt(num);
            string dec=decipher(enc);
            cout<<"加密後的密碼為:"<<enc<<endl;
            cout<<"解密後的密碼為:"<<dec<<endl;
        }
        cout<<"請輸入一個五位數的整數(輸入 0 結束程式):";
    }
    return 0;
}
 
以下是輸出結果:
66fbada1156f3.jpg
 
然後我請谷哥小姐模擬自己是leetcode幫我試了一堆結果顯示通過
66fbaf4a6d3eb.jpg
就參考看看這樣: )
詳解 提供者:hchungw
def encrypt(n):
    # 將數字轉換為五位數字串
    s = str(n)
    # 將每個數字加5後除以10取餘數
    encrypted = ''.join(str((int(char) + 5) % 10) for char in s)
    # 進行位置互換
    encrypted = encrypted[4] + encrypted[3] + encrypted[2] + encrypted[1] + encrypted[0]
    return int(encrypted)
def decipher(n):
    s = str(n)
    # 進行位置互換
    decrypted = s[4] + s[3] + s[2] + s[1] + s[0]
    # 將每個數字減5並處理負數情況
    decrypted = ''.join(str((int(char) - 5) % 10) for char in decrypted)
    return int(decrypted)
if __name__ == '__main__':
    while True:
        user_input = input("請輸入一個五位數的整數(輸入 0 結束程式):")
        if user_input.isdigit():
            num = int(user_input)
            if num == 0:
                print("感謝使用此程式,歡迎您對此程式的優化提出建議。")
                break
            elif 10000 <= num <= 99999:
                encrypted = encrypt(num)
                print(f"加密後的密碼為:{encrypted}")
                decrypted = decipher(encrypted)
                print(f"解密後的密碼為:{decrypted}")
            else:
                print("所輸入的數值並不是五位數之整數")
        else:
            print("請輸入有效的數字")
這段程式先定義了加密(encrypt)和解密(decipher)函數,然後透過一個無窮迴圈來讓使用者反覆輸入數字直到輸入0為止。如果輸入的數字不是五位數,程式會提示重新輸入。這樣的設計滿足了題目的要求,並提供了一個基本的用戶互動界面。