Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 6 của 6
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    Bài tập rút gọn xâu trong C. Giúp mình giải thuật với?

    Mình đang làm 1 bài tập sau:
    Cho 1 xâu ký tự gồm dãy các chữ số có 3 chữ số:

    Input:
    101,102,103,104,105,201,202,203,301,302,303,304,30 5,306,401,405,406,408

    Output: Là xâu rút gọn của xâu đã cho
    101-105,201,202,203,301-306,401,405,406,408.

    Nếu dãy số liên tục gồm nhiều hơn 3 số thì đưa về dạng somin-somax.

    Mình vẫn chưa tìm được hướng giải bài này. Các bạn có thể nêu ra giải thuật cho bài này, mình sẽ tự code lây. Các bạn giúp mình nhé. Xin cám ơn.[IMG]images/smilies/clap_grin.gif[/IMG]

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Mã:
    #include<stdio.h>#include<conio.h> int main(){    int a[18]={101,102,103,104,105,201,202,203,301,302,303,304,305,306,401,405,406,408};    for ( int i=0;i<18;i++)    {        if(a[i+1]==a[i]+1&&a[i+2]==a[i]+2&&a[i+3]==a[i]+3)        {            printf("%d",a[i]);            while(a[i+1]==a[i]+1)            {                i++;            }            printf("-%d,",a[i]);        }        else        {            printf("%d,",a[i]);        }    }    getch();    return 0;}

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi svcntt
    Mình đang làm 1 bài tập sau:
    Cho 1 xâu ký tự gồm dãy các chữ số có 3 chữ số:

    Input:
    101,102,103,104,105,201,202,203,301,302,303,304,30 5,306,401,405,406,408

    Output: Là xâu rút gọn của xâu đã cho
    101-105,201,202,203,301-306,401,405,406,408.

    Nếu dãy số liên tục gồm nhiều hơn 3 số thì đưa về dạng somin-somax.

    Mình vẫn chưa tìm được hướng giải bài này. Các bạn có thể nêu ra giải thuật cho bài này, mình sẽ tự code lây. Các bạn giúp mình nhé. Xin cám ơn.[IMG]images/smilies/clap_grin.gif[/IMG]
    Đây là bài tập của ông Vượng đây mà. Mình học giảng đường của cô Trang. Bài này hôm qua đứa bạn mình cũng hỏi mình nhưng đang ôn CSDL của bà Trinh nên ko tìm hiểu được. Đây hình như còn phải xử lý xâu nữa thì phải. Nếu là một mảng thì bài của chị cafe thì ok rồi. Còn nếu là phải xử lý xâu nữa thì mình cũng chưa nghĩ ra cách gì.

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    chị cafe không đọc kĩ đề rùi . Đây là 1 xâu mà

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    hơi ời ơi [IMG]images/smilies/biggrin.png[/IMG] , thì thêm hàm biến từ xâu sang số thôi [IMG]images/smilies/biggrin.png[/IMG]


    Mã:
    #include<stdio.h>#include<conio.h>#include<string.h>int main(){    int t,j=1,n=18,a[90];    char s[90]="101,102,103,104,105,201,202,203,301,302,303,304,305,306,401,405,406,408";    for(int i=0;i<strlen(s);i++)    {                        t=0;        while(s[i]!=',')        {                        int k=0;                        k=s[i]-48;                        t=t*10+k;                        if(s[i+1]==','||s[i+1]=='\0')                        a[j++]=t;                        i++;                            }    }    for(int i=1;i<=n;i++)    printf("%4d",a[i]);    printf("
    ");    puts (s);    getch();    return 0;}
    này mình gán luôn n, cònnếu xâu chuẩn hoá rồi, thì đếm số ký tự ',' trong chuỗi rồi gán n là được

  6. #6
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    Code trên xâu lun nè, đọc file cho tiện

    Mã:
    long getfilesize (FILE *f) {    long size ;    long oldpos = ftell (f) ;    fseek (f, 0, SEEK_END) ;    size = ftell (f) ;    fseek (f, oldpos, SEEK_SET) ;    return size;} //------------------------------------------------------------------------ char* readfile (char const * filename, char const * openmode) {    char *buf ;    int size ;    FILE *f = fopen (filename, openmode) ;    if (!f)        return NULL ;    buf = (char*) malloc ((size = getfilesize (f)) * sizeof(char)) ;    if (!buf)        return NULL ;    fgets (buf, size, f) ;    fclose (f) ;    return buf ;} ////////////////////////////////////////////////////////////////////////////////////// int main () {    char const * delim = ", " ;    char *p ;    int v1, v2, _tmp ;    char *s = readfile ("numberstring.txt") ;    if (s) {        p = strtok (s, delim) ;         if (p) {            v1 = v2 = atoi (p) ;            printf ("
    %d", v1) ;            while (p = strtok (NULL, delim)) {                _tmp = atoi (p) ;                if (_tmp == v2 + 1)                    v2++ ;                else {                    if (v2 != v1)                        printf ("-%d", v2) ;                    printf (",%d", _tmp) ;                    v1 = v2 = _tmp ;                }            }        }         printf ("
    
    ") ;        free (s) ;    }    return 0 ;}
    [IMG]images/smilies/biggrin.png[/IMG]

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •