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

ZZULI OJ 1167 逆轉數:指針操作字符串實現大整數反轉

     編輯:關於C語言

ZZULI OJ 1167 逆轉數:指針操作字符串實現大整數反轉

題目來源:ZZULI OJ 1167
核心標籤:字符串處理、指針操作、大整數、邊界條件

題目要求

輸入一個最長 100 位的整數(可能為負),輸出其「逆轉數」:

  1. 末尾無 0:直接倒序輸出所有數字
  2. 負數:保留負號,數字部分倒序
  3. 末尾有 0:0 移至反轉後的末尾,如 reverse(1200) = 2100、reverse(-56) = -65

要求實現函數 void reverse(char *str) 就地修改字符串。

核心邏輯:三階段處理

  1. 記錄負號:若首字符為 '-',先輸出負號,處理範圍縮為 str[1...len-1]
  2. 倒序輸出非零部分:從末尾向前掃描,跳過連續的 '0' 並計數,遇到首個非零字符開始輸出
  3. 補回跳過的 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 會處理到它,但為了統一邏輯,代碼選擇迴圈結束後單獨輸出
  • 輸入保證無前導 0,輸出邏輯自然不會產生前導 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 移位
12002100正數尾部 0 移位
-56-65負數無尾部 0
00邊界:單個 0

本題考察字符串指針操作、邊界條件處理與輸出格式控制,是指針專題中的經典入門題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved