題目來源:ZZULI OJ 1167
核心標籤:字符串處理、指針操作、大整數、邊界條件
輸入一個最長 100 位的整數(可能為負),輸出其「逆轉數」:
reverse(1200) = 2100、reverse(-56) = -65要求實現函數 void reverse(char *str) 就地修改字符串。
'-',先輸出負號,處理範圍縮為 str[1...len-1]'0' 並計數,遇到首個非零字符開始輸出'0'#include#include #include using namespace std; int main() { char str[101]; gets(str); // 讀取整行,含可能的負號 int len = strlen(str); int i, flag = 0, count = 0; // 1. 處理負號 if (str[0] == '-') printf("-"); // 2. 從末尾倒序掃描數字部分 for (i = len - 1; i >= (str[0] == '-' ? 1 : 0); i--) { if (str[i] == '0' && flag == 0) { count++; // 統計尾部連續 0 continue; // 暫不輸出 } if (str[i] != '0' || flag != 0) { printf("%c", str[i]); flag = 1; // 標記已進入非零區 } } // 3. 若原數為正,需補輸出最高位(迴圈終止條件 i>=0 會漏掉 str[0]) if (str[0] != '-') printf("%c", str[0]); // 4. 補回尾部 0 for (i = 1; i <= count; i++) printf("0"); return 0; }
flag 區分「還在跳過尾部 0」與「已進入有效數字」兩階段str[0] 是最高位數字,倒序迴圈 i >= 0 會處理到它,但為了統一邏輯,代碼選擇迴圈結束後單獨輸出101 滿足「最長 100 位 + \0」void reverse(char *str)void reverse(char *str) {
int len = strlen(str);
int start = (str[0] == '-') ? 1 : 0;
int end = len - 1;
int count = 0;
// 統計尾部 0
while (end >= start && str[end] == '0') {
count++; end--;
}
// 倒序移動非零部分
int write = start;
for (int i = end; i >= start; i--) {
str[write++] = str[i];
}
// 補 0
while (count--) str[write++] = '0';
str[write] = '\0';
}
此版本就地修改,無額外輸出,符合題目函數簽名要求。
| 輸入 | 輸出 | 說明 |
|---|---|---|
-123456789000 | -987654321000 | 負數 + 尾部 0 移位 |
1200 | 2100 | 正數尾部 0 移位 |
-56 | -65 | 負數無尾部 0 |
0 | 0 | 邊界:單個 0 |
本題考察字符串指針操作、邊界條件處理與輸出格式控制,是指針專題中的經典入門題。