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