HDU1106

Problem: 排序
Description: 输入一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以‘0’开头,这些头部的‘0’应该被忽略掉,除非这个整数就是由若干个‘0’组成的,这时这个整数就是0)。
你的任务是:对这些分割得到的整数,依从小到大的顺序排序输出。
Solution: 我们利用string.h中的strtok函数。这个函数可以按指定分隔符分隔字符串,我个人是看了这个函数的源码才理解为什么是下面这种用法。建议百度一下这个函数去看看,其实这个题目也可以不用这个函数完成的。也可以用strstr+strncpy完成。下面我都给出源码。
Code(C++):

strtok:

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

const int M=1005;

int cmp(const void *a,const void *b)
{
    return *((int *)a)-*((int *)b);
}

int main()
{
    char string[M];
    int digit[M];
    int top;
    while(~scanf("%s",string)){
        top=0;
        for(char *str=strtok(string,"5");str!=NULL;str=strtok(NULL,"5"))
            digit[top++]=atoi(str);
        qsort(digit,top,sizeof(digit[0]),cmp);
        printf("%d",digit[0]);
        for(int i=1;i<top;i++)
            printf(" %d",digit[i]);
        puts("");
    }
    return 0;
}

strstr+strncpy:

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

const int M=1005;

int cmp(const void *a,const void *b)
{
    return *((int *)a)-*((int *)b);
}

int main()
{
    char string[M];
    int digit[M];
    int top;
    while(~scanf("%s",string)){
        top=0;
        int len=strlen(string);
        string[len]='5';
        string[len+1]=0;
        char *next=string;
        for(char *p=strstr(next,"5");p!=NULL;p=strstr(next,"5")){
            if(next==p){
                next++;
                continue;
            }
            char tmp[15]={0};
            strncpy(tmp,next,p-next);
            digit[top++]=atoi(tmp);
            next=p+1;
        }
        qsort(digit,top,sizeof(digit[0]),cmp);
        printf("%d",digit[0]);
        for(int i=1;i<top;i++)
            printf(" %d",digit[i]);
        puts("");
    }
    return 0;
}

你可能感兴趣的:(函数)