Skip to main content

【UVa】272 - TEX Quotes

英文題目傳送門,中文題目傳送門

程式的流程設計是這樣的:
  1. 使用gets收下字串到字元陣列inputString
  2. 初始化用來儲存輸出字元陣列的outputString,以及記錄outputString目前放到哪個字元的outputIndex
    • 注意!這邊的inputStringoutputString建議設到10K,不然會給Runtime Error
    • 注意!這邊不需要初始化用來判斷使用哪個引號的flagQuote,用了反而會得到WA...
  3. 一一比對每個字元,
    • 如果不是雙引號,則將該字元直接儲存到outputStringoutputIndex加一
    • 如果出現雙引號("),則根據flagQuote數值,在outputString中放入左雙引號或右雙引號,outputIndex加二
  4. 最後使用puts(outputString)印出字串


程式碼如下:

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

int main( int argc , char *argv []) {
        
    int i;
    int flagQuote = 1;
    
    /* need 100000 to avoid runtime error*/
    char inputString[100000];
    
    /* use gets() to get input string, except /n char*/
    while(gets(inputString)){
        
         /*initialize the containers*/
         int outputIndex = 0;
         char outputString [100000] = {};
        
         for (i = 0; i < strlen(inputString); i++){
             if (inputString[i] == '"'){
                
                 if (flagQuote){
                     /* meet " first time*/
                    outputString[outputIndex] = '`';
                    outputString[outputIndex +1] = '`';
                 } else{
                    outputString[outputIndex ] = '\'';
                    outputString[outputIndex +1] = '\'';
                 }
                flagQuote = (flagQuote == 1)? 0: 1;
                outputIndex +=2;
             }else{
                outputString[outputIndex] = inputString[i];
                outputIndex++;
             }
         }
        puts(outputString);
    }
    return 0;
}
  
另外在網路上有看到更簡潔的方式!直接將雙引號已左雙引號或右雙引號print出來!原來UVa可以不用擠在一行印出來,Orz

修改後的程式碼如下:

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

int main( int argc , char *argv []) {
        
    int i;
    int flagQuote = 1;
    
    char inputString[100000];
        
    while(gets(inputString)){
        
         for (i = 0; i < strlen(inputString); i++){
             if (inputString[i] == '"'){
                 if (flagQuote){
                    printf("``");
                 } else{
                    printf("\'\'");
                 }
                flagQuote = (flagQuote == 1)? 0: 1;
             }else{
                printf("%c", inputString[i]);
             }
         }   
        printf("\n");
    }
    return 0;
}
  

想挑戰更難的:102 Ecological Bin Packing

Comments

Popular posts from this blog

淺介I2C

I 2 C 起源 內部整合電路( Inter-Integrated Circuit, I 2 C, 讀做 I-square-C )是由飛利浦半導體公司開發的一種專用介面。 I 2 C 是以最少的連接線進行硬體佈線還要有靈活擴充的特性為目標而設計,最後出現了只有以序列資料線 SDA ( Serial DAta )及序列時脈線 SCL ( Serial CLock )來進行所有通訊的 I 2 C 介面, I 2 C 允許多主( master )多僕( slave )系統,其傳輸系統內每一個裝置都有唯一的地址可供辨識。資料的寫入和讀取都是由 master 主動發起, slave 無法主動向 master 回報,除非使用中斷腳通知 master 。 I 2 C 傳輸速度有慢(小於 100Kbps )、快( 400Kbps )及高速( 3.4Mbps )三種,每一種均可向下相容。 I 2 C 電路配置 如前所述 I 2 C 為兩線式,一為時脈線 SCL ,另一條為資料線 SDA ,硬體線路如圖 1 ,兩線皆為雙向性,且都需要透過高接電阻( pull-up, 對岸說的上拉電阻)接電。平常不使用時, SCL 與 SDA 的訊號都處於高電位。為了多裝置共線的功能,裝置的 SCL 和 SDA 腳位要為 開洩極( open-drain ) 或 開集極( open-collector ) 。一旦有一個腳位的開洩極導通接地,則整條線都為低電位,這種現象稱作 wired-AND 運作 ;如同邏輯 AND 運算,需要共接的腳位都是 1 (開洩極斷路),該條線的電位才是 1 。如果沒有開洩極的腳位,可以使用具內部高接電阻的腳位,當要輸出 1 時,則設定該腳位為高接型輸入腳;而輸出為 0 時,則改設定為輸出腳並輸出 0 的值。 圖 1. I 2 C 傳輸裝置接線 [1] I 2 C 通訊協定 為使說明部分更簡潔,首先介紹幾個名詞: 位元傳輸協定 當 master 要跟 slave 溝通時,會先有個起始條件( start condition )的訊號,結束時也會送出終止條件( stop condition )訊號。起始條件訊號

【Arduino】Timers, Registers, and Fast PWM Mode

由於Arduino預設的PWM控制方法僅有500Hz(好像還有另一個),想要知道怎樣才可以調整成其他頻率,以此做記錄。 先說明Timer設定方式、PWM Mode,之後會在Arduino上實做。 如果對_BV()沒有概念,可以參考 【Arduino I/O Ports】Control under avr-libc 這篇文章。

Emart Sunny Sale: 3D Shadow QR Code

  Emart是韓國連鎖超市,近期他們發現中午12:00到下午1:00的銷售量會明顯減少,為了提高銷售量他們製作出了帶有日晷概念的3D QR code。