首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

華為機試經典三題:身分證、手機號、郵箱驗證完整解法

     編輯:C++ 入門

題目一:身分證號碼驗證

規則說明

  • 長度 18 位
  • 第 1-17 位為數字
  • 第 18 位為數字或小寫 'x'
  • 第 7-14 位為出生日期(YYYYMMDD)
  • 年份範圍 1900-2100,需驗證閏年與大小月

回傳代碼

代碼含義
0合法
1長度不合法
2第 1-17 位含非數字
3第 18 位非數字且非 'x'
4年份非法
5月份非法
6日期非法

優先級遞減:長度 → 字元 → 日期。

題目二:手機號碼驗證

規則說明

  • 長度 13 位(含國家碼)
  • 以 "86" 開頭
  • 全為數字

回傳代碼

代碼含義
0合法
1長度不合法
2含非數字
3非 86 開頭

題目三:郵箱地址驗證

規則說明

  • 僅能有一個 '@'
  • 結尾必為 ".com"
  • 無空格
  • 合法字元:1-9, a-z, A-Z, '.', '@', '_'

回傳:'1' 合法,'0' 不合法。

完整 C++ 參考實作

身分證驗證

int isLeapYear(int year) {
    return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}

int verifyID(char* inID) {
    int len = strlen(inID);
    if (len != 18) return 1;
    
    for (int i = 0; i < 17; i++)
        if (inID[i] < '0' || inID[i] > '9') return 2;
    
    if (!((inID[17] >= '0' && inID[17] <= '9') || inID[17] == 'x')) return 3;
    
    string s(inID);
    int year = stoi(s.substr(6, 4));
    if (year < 1900 || year > 2100) return 4;
    
    int month = stoi(s.substr(10, 2));
    if (month < 1 || month > 12) return 5;
    
    int day = stoi(s.substr(12, 2));
    int maxDay;
    if (month == 2) maxDay = isLeapYear(year) ? 29 : 28;
    else if (month == 4 || month == 6 || month == 9 || month == 11) maxDay = 30;
    else maxDay = 31;
    
    if (day < 1 || day > maxDay) return 6;
    return 0;
}

手機號驗證

int verifyMsisdn(char* inMsisdn) {
    int len = strlen(inMsisdn);
    if (len != 13) return 1;
    
    for (int i = 0; i < len; i++)
        if (inMsisdn[i] < '0' || inMsisdn[i] > '9') return 2;
    
    if (inMsisdn[0] != '8' || inMsisdn[1] != '6') return 3;
    return 0;
}

郵箱驗證

void vConvertMsg(char *pInputStr, long lInputLen, char *pOutputStr) {
    int atCount = 0, spaceCount = 0, errorCount = 0;
    
    for (int i = 0; i < lInputLen; i++) {
        char c = pInputStr[i];
        if (c == '@') atCount++;
        else if (c == ' ') spaceCount++;
        else if (!((c >= '1' && c <= '9') || (c >= 'a' && c <= 'z') || 
                   (c >= 'A' && c <= 'Z') || c == '_' || c == '.' || c == '@'))
            errorCount++;
    }
    
    if (atCount != 1 || spaceCount != 0 || errorCount != 0) {
        *pOutputStr = '0'; return;
    }
    
    // 檢查 .com 結尾
    if (lInputLen >= 4 && pInputStr[lInputLen-4] == '.' && 
        pInputStr[lInputLen-3] == 'c' && pInputStr[lInputLen-2] == 'o' && 
        pInputStr[lInputLen-1] == 'm')
        *pOutputStr = '1';
    else
        *pOutputStr = '0';
}

測試案例

  • 869123456789 (12位) → 返回 1
  • 88139123456789 → 返回 3
  • 8613912345678 (13位) → 返回 0
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved