5-24 树种统计 (25分)

来源:互联网 发布:linux lsnrctl 编辑:程序博客网 时间:2024/04/28 20:03

5-24 树种统计 (25分)

随着卫星成像技术的应用,自然资源研究机构可以识别每一棵树的种类。请编写程序帮助研究人员统计每种树的数量,计算每种树占总数的百分比。
输入格式:

输入首先给出正整数N( <=105​​),随后N行,每行给出卫星观测到的一棵树的种类名称。种类名称由不超过30个英文字母和空格组成(大小写不区分)。
输出格式:

按字典序递增输出各种树的种类名称及其所占总数的百分比,其间以空格分隔,保留小数点后4位。
输入样例:

29Red AlderAshAspenBasswoodAshBeechYellow BirchAshCherryCottonwoodAshCypressRed ElmGumHackberryWhite OakHickoryPecanHard MapleWhite OakSoft MapleRed OakRed OakWhite OakPoplanSassafrasSycamoreBlack WalnutWillow

输出样例:

Ash 13.7931%Aspen 3.4483%Basswood 3.4483%Beech 3.4483%Black Walnut 3.4483%Cherry 3.4483%Cottonwood 3.4483%Cypress 3.4483%Gum 3.4483%Hackberry 3.4483%Hard Maple 3.4483%Hickory 3.4483%Pecan 3.4483%Poplan 3.4483%Red Alder 3.4483%Red Elm 3.4483%Red Oak 6.8966%Sassafras 3.4483%Soft Maple 3.4483%Sycamore 3.4483%White Oak 10.3448%Willow 3.4483%Yellow Birch 3.4483%

思路
这些书中名称长度较长,且无明显规律,所以哈希算法并没优势。
下面的代码我是用了二叉搜索树的结构存储数据,在输出结果的时候用的是中序遍历。百分比是在输出的时候才计算。

点击访问 PTA-测验

#include<stdlib.h>#include<stdio.h>#include<string.h>/* 评测结果 时间  结果  得分  题目  编译器     用时(ms)  内存(MB)  用户2016-08-30 09:22    答案正确    25  5-24    gcc     501     13  569985011测试点结果 测试点     结果  得分/满分   用时(ms)  内存(MB)测试点1    答案正确    15/15   14  1测试点2    答案正确    2/2     1   1测试点3    答案正确    4/4     501     13测试点4    答案正确    4/4     85  6查看代码*///C语言stricmp()函数:比较字符串(不区分大小写#define lowcase(x) ((x)>='a'&&(x)<='z')#define capitol(x) ((x)>='A'&&(x)<='Z')typedef struct node *BinTree;struct node {    char Data[33];    int cnt;    BinTree Left;    BinTree Right;};BinTree InsertT(BinTree BT,char*);BinTree BuildT(char*);void PrintT(BinTree,int);char*scan(void){    char*a=(char*)malloc(sizeof(char)*33);    int i=0;    char c;    while((c=getchar())!='\n'){    a[i++]=c;    }    a[i]='\0';    return a;}int cmp(char*a,char*b){    for(;*a!='\0';a++,b++){        if(lowcase(*a)){            if(capitol(*b)){                if(*b+32==*a)continue;                else return *a-*b;            }            if(*b==*a)continue;            else return *a-*b;        }else{            if(lowcase(*b)){                if(*b-32==*a)continue;                else return *a-*b;            }            if(*b==*a)continue;            else return *a-*b;        }    }    return *a-*b;}int main() {    int n;    scanf("%d",&n);    getchar();    char *a;    BinTree BT=NULL;    for(int i=0; i<n; i++) {        a=scan();        BT=InsertT(BT,a);//  printf("\n------%d----------\n",i+1);           }    PrintT(BT,n);    return 0;}void PrintT(BinTree BT,int n) {    if(BT) {        PrintT(BT->Left ,n);        double percent=(double)BT->cnt*100.0/n;         printf("%s %0.4lf%%\n",BT->Data ,percent);//      printf("{%d}",BT->cnt );        PrintT(BT->Right,n );    }}BinTree InsertT(BinTree BT,char*name) {    BinTree head=BT;    while(BT) {        int flag=cmp(BT->Data ,name);        if(flag<0) {            if(BT->Right)BT=BT->Right ;            else {                 BT->Right =BuildT(name);                return head;            }        }else        if(flag>0) {            if(BT->Left )BT=BT->Left ;            else {                BT->Left =BuildT(name);                return head;            }        }else{            BT->cnt+=1 ;//          printf("[]");            return head;        }    }    return BuildT(name);}BinTree BuildT(char*Data) {    BinTree New=(BinTree)malloc(sizeof(struct node));    strcpy(New->Data ,Data);    New->cnt =1;    New->Left =NULL;    New->Right =NULL;    return New;}
0 0
原创粉丝点击