PAT_B_1078 字符串壓縮與解壓

問題描述

文本壓縮有不少種方法,這裏咱們只考慮最簡單的一種:把由相同字符組成的一個連續的片斷用這個字符和片斷中含有這個字符的個數來表示。
例如 ccccc 就用 5c 來表示。若是字符沒有重複,就原樣輸出。例如 aba 壓縮後仍然是 aba。
解壓方法就是反過來,把形如 5c 這樣的表示恢復爲 ccccc。
本題須要你根據壓縮或解壓的要求,對給定字符串進行處理。這裏咱們簡單地假設原始字符串是徹底由英文字母和空格組成的非空字符串。
輸入格式:
輸入第一行給出一個字符,若是是 C 就表示下面的字符串須要被壓縮;若是是 D 就表示下面的字符串須要被解壓。
第二行給出須要被壓縮或解壓的不超過 1000 個字符的字符串,以回車結尾。題目保證字符重複個數在整型範圍內,且輸出文件不超過 1MB。
輸出格式:
根據要求壓縮或解壓字符串,並在一行中輸出結果。
輸入樣例 1:
C
TTTTThhiiiis isssss a   tesssst CAaaa as
輸出樣例 1:
5T2h4is i5s a3 te4st CA3a as

輸入樣例 2:
D
5T2h4is i5s a3 te4st CA3a as10Z
輸出樣例 2:
TTTTThhiiiis isssss a   tesssst CAaaa asZZZZZZZZZZ

AC代碼:

// PAT_1078_字符串壓縮與解壓 

# include <stdio.h>
# include <string.h>

int main(void)
{
    char ch[1010];
    char Test;
    char a;
    int flag = 0;
    int sum = 0; // 記錄字符的個數 
    int i = 0; // 控制ch 的變化

    // 讀入字符串 
    Test = getchar();
    getchar();
    gets(ch);    
    
    while (ch[i] != '\0' && Test == 'D')
    {
        sum = 0;
        // 若是碰見數字,則轉化爲字符 
        if (ch[i]>='0' && ch[i]<='9')  
        {
            sum = ch[i] - '0';
            while (ch[i+1]>='0' && ch[i+1]<='9')
            {
                sum *= 10;
                i++;
                sum += ch[i] - '0';
            }    
            sum--;
            // 輸出
            while(sum != 0) 
            {
                printf("%c",ch[i+1]);
                sum--;
            }
        }
        else
        {
            printf("%c",ch[i]);
        }
            
        i++;
    }
    
    while (ch[i] != '\0' && Test == 'C')
    {
        sum = 1;
        a = ch[i];
        while (ch[i] == ch[i+1] && ch[i]!='\0')
        {
            sum++;
            i++;
        } 
        if (1 != sum)
            printf("%d%c",sum,a);
        else
            printf("%c",a);    
        i++;
    }
    
    return 0;
}
相關文章
相關標籤/搜索