#27918: 請問我這樣的寫法哪有誤?


ic231542211 (willie)

學校 : 不指定學校
編號 : 44051
來源 : [123.194.107.200]
最後登入時間 :
2022-09-15 15:14:37
a565. 2.p&q的邂逅 -- 101學年度台北市資訊學科能力競賽 | From: [123.194.107.200] | 發表日期 : 2021-11-05 16:11

#include<stdio.h>

#include<string.h>

int main(){

    int num;

    char s[1000000];

    while(scanf("%d", &num) != EOF){

        int p = 0, count = 0;

        for(int i = 0; i < num; i++){

            gets(s);

            for(int j = 0; j < strlen(s); j++){

                if(s[j] == '.'){

                    continue;

                }

                else if(s[j] == 'p'){

                    p++;

                }

                else if(s[j] == 'q' && p > 0){//讀取的字元為q,且之前有讀到字元p

                    p--;

                    count++;

                }

            }

        }

         printf("%d\n", count);

    }

}

 
#27931: Re:請問我這樣的寫法哪有誤?


cges30901 (cges30901)

學校 : 不指定學校
編號 : 30877
來源 : [39.9.74.255]
最後登入時間 :
2024-10-14 22:20:08
a565. 2.p&q的邂逅 -- 101學年度台北市資訊學科能力競賽 | From: [180.217.245.150] | 發表日期 : 2021-11-06 10:52

#include

#include

int main(){

    int num;

    char s[1000000];

    while(scanf("%d", &num) != EOF){

        int p = 0, count = 0;

        for(int i = 0; i < num; i++){

            gets(s);

            for(int j = 0; j < strlen(s); j++){

                if(s[j] == '.'){

                    continue;

                }

                else if(s[j] == 'p'){

                    p++;

                }

                else if(s[j] == 'q' && p > 0){//讀取的字元為q,且之前有讀到字元p

                    p--;

                    count++;

                }

            }

        }

         printf("%d\n", count);

    }

}


1. 每一行是一組名單,每一組要輸出一個數字

2. scanf("%d", &num) 這個數字後面的換行符號會留在buffer裡,所以下面第一個gets()得到的只有換行符號

3. 長度最大有10⁷,你的陣列不夠大

 
#27942: Re:請問我這樣的寫法哪有誤?


ic231542211 (willie)

學校 : 不指定學校
編號 : 44051
來源 : [123.194.107.200]
最後登入時間 :
2022-09-15 15:14:37
a565. 2.p&q的邂逅 -- 101學年度台北市資訊學科能力競賽 | From: [123.194.107.200] | 發表日期 : 2021-11-06 19:23

#include

#include

int main(){

    int num;

    char s[1000000];

    while(scanf("%d", &num) != EOF){

        int p = 0, count = 0;

        for(int i = 0; i < num; i++){

            gets(s);

            for(int j = 0; j < strlen(s); j++){

                if(s[j] == '.'){

                    continue;

                }

                else if(s[j] == 'p'){

                    p++;

                }

                else if(s[j] == 'q' && p > 0){//讀取的字元為q,且之前有讀到字元p

                    p--;

                    count++;

                }

            }

        }

         printf("%d\n", count);

    }

}


1. 每一行是一組名單,每一組要輸出一個數字

2. scanf("%d", &num) 這個數字後面的換行符號會留在buffer裡,所以下面第一個gets()得到的只有換行符號

3. 長度最大有10⁷,你的陣列不夠大

 

我改寫成這樣:

#include<stdio.h>

#include<string.h>

int main(){

    int num;

    char s[10000000] = {0};

    scanf("%d\n", &num);

        for(int i = 0; i < num; i++){

            gets(s);

            int p = 0, count = 0;

            for(int j = 0; j < strlen(s); j++){

                if(s[j] == '.'){

                    continue;

                }

                else if(s[j] == 'p'){

                    p++;

                }

                else if(s[j] == 'q' && p > 0){//讀取的字元為q,且之前有讀到字元p

                    p--;

                    count++;

                }

            }

            printf("%d\n", count);

        }

    }

但是只要陣列大小開成10⁷,一執行程式就會爆掉,怎麼辦?



 
#27944: Re:請問我這樣的寫法哪有誤?


cges30901 (cges30901)

學校 : 不指定學校
編號 : 30877
來源 : [39.9.74.255]
最後登入時間 :
2024-10-14 22:20:08
a565. 2.p&q的邂逅 -- 101學年度台北市資訊學科能力競賽 | From: [180.217.234.235] | 發表日期 : 2021-11-06 20:04

#include

#include

int main(){

    int num;

    char s[1000000];

    while(scanf("%d", &num) != EOF){

        int p = 0, count = 0;

        for(int i = 0; i < num; i++){

            gets(s);

            for(int j = 0; j < strlen(s); j++){

                if(s[j] == '.'){

                    continue;

                }

                else if(s[j] == 'p'){

                    p++;

                }

                else if(s[j] == 'q' && p > 0){//讀取的字元為q,且之前有讀到字元p

                    p--;

                    count++;

                }

            }

        }

         printf("%d\n", count);

    }

}


1. 每一行是一組名單,每一組要輸出一個數字

2. scanf("%d", &num) 這個數字後面的換行符號會留在buffer裡,所以下面第一個gets()得到的只有換行符號

3. 長度最大有10⁷,你的陣列不夠大

 

我改寫成這樣:

#include

#include

int main(){

    int num;

    char s[10000000] = {0};

    scanf("%d\n", &num);

        for(int i = 0; i < num; i++){

            gets(s);

            int p = 0, count = 0;

            for(int j = 0; j < strlen(s); j++){

                if(s[j] == '.'){

                    continue;

                }

                else if(s[j] == 'p'){

                    p++;

                }

                else if(s[j] == 'q' && p > 0){//讀取的字元為q,且之前有讀到字元p

                    p--;

                    count++;

                }

            }

            printf("%d\n", count);

        }

    }

但是只要陣列大小開成10⁷,一執行程式就會爆掉,怎麼辦?



這題不需要用陣列,用字元就可以了,在迴圈內用getchar()每次讀取一個字元就不會爆掉了

 
#27946: Re:請問我這樣的寫法哪有誤?


ic231542211 (willie)

學校 : 不指定學校
編號 : 44051
來源 : [123.194.107.200]
最後登入時間 :
2022-09-15 15:14:37
a565. 2.p&q的邂逅 -- 101學年度台北市資訊學科能力競賽 | From: [123.194.107.200] | 發表日期 : 2021-11-06 20:21

#include

#include

int main(){

    int num;

    char s[1000000];

    while(scanf("%d", &num) != EOF){

        int p = 0, count = 0;

        for(int i = 0; i < num; i++){

            gets(s);

            for(int j = 0; j < strlen(s); j++){

                if(s[j] == '.'){

                    continue;

                }

                else if(s[j] == 'p'){

                    p++;

                }

                else if(s[j] == 'q' && p > 0){//讀取的字元為q,且之前有讀到字元p

                    p--;

                    count++;

                }

            }

        }

         printf("%d\n", count);

    }

}


1. 每一行是一組名單,每一組要輸出一個數字

2. scanf("%d", &num) 這個數字後面的換行符號會留在buffer裡,所以下面第一個gets()得到的只有換行符號

3. 長度最大有10⁷,你的陣列不夠大

 

我改寫成這樣:

#include

#include

int main(){

    int num;

    char s[10000000] = {0};

    scanf("%d\n", &num);

        for(int i = 0; i < num; i++){

            gets(s);

            int p = 0, count = 0;

            for(int j = 0; j < strlen(s); j++){

                if(s[j] == '.'){

                    continue;

                }

                else if(s[j] == 'p'){

                    p++;

                }

                else if(s[j] == 'q' && p > 0){//讀取的字元為q,且之前有讀到字元p

                    p--;

                    count++;

                }

            }

            printf("%d\n", count);

        }

    }

但是只要陣列大小開成10⁷,一執行程式就會爆掉,怎麼辦?



這題不需要用陣列,用字元就可以了,在迴圈內用getchar()每次讀取一個字元就不會爆掉了

謝謝你幫我解答,我後來上網查了一下,把陣列改成"動態記憶體配置"就不會爆掉了。



 
ZeroJudge Forum