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

HDU 5059 Help him 詳細解析與代碼實現

     編輯:C++ 入門

HDU 5059 Help him 詳細解析

這道題目要求判斷一個給定的數字字符串是否在兩個邊界值之間。核心難點在於處理大整數比較、負號判斷、前導零檢查以及空字符串等邊界情況。由於數字可能超出標準類型範圍,必須採用字符串比較的方式。

解題思路

首先編寫 judge() 函數驗證字符串是否為合法整數:檢查是否為空、負號是否獨立存在、是否有前導零、所有字符是否為數字。接著實現 big() 函數進行大整數比較:先處理符號,再比較長度,最後逐位比較數值。最後在 solve() 中綁定邏輯:輸入數字必須合法,且嚴格大於下界且小於上界。

關鍵代碼實現

#include <cstdio>
#include <cstring>
const int N = 105;
char n[N], a[N], b[N];

bool judge(char *str) {
    int len = strlen(str);
    if (len == 0) return false;
    int s = 0;
    if (str[s] == '-') {
        if (len == 1) return false;
        s++;
    }
    if (len != 1 && str[s] == '0') return false;
    for (int i = s; i < len; i++) {
        if (str[i] < '0' || str[i] > '9') return false;
    }
    return true;
}

bool big(char *a, char *b) {
    if (a[0] == '-' && b[0] != '-') return false;
    if (a[0] != '-' && b[0] == '-') return true;
    int i = 0, j = 0;
    int lena = strlen(a), lenb = strlen(b);
    bool flag = true;
    if (a[i] == '-' && b[j] == '-') {
        i++; j++; flag = false;
    }
    if (lena > lenb) return flag;
    if (lena < lenb) return !flag;
    while (i < lena && j < lenb) {
        if (a[i] > b[j]) return flag;
        else if (a[i] < b[j]) return !flag;
        i++; j++;
    }
    return true;
}

bool solve() {
    if (!judge(n)) return false;
    if (big(n, a) && big(b, n)) return true;
    return false;
}

int main() {
    while (gets(n) != NULL) {
        scanf("%s%s%*c", a, b);
        while (!judge(a) || !judge(b));
        printf("%s\n", solve() ? "YES" : "NO");
    }
    return 0;
}

注意事項

  • 必須處理空字符串、單獨負號、前導零等非法輸入
  • 大整數比較時要區分正負數邏輯
  • 輸入讀取需注意換行符處理
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved