新建Microsoft Word文档,C/C++

问题描述

  L正在出题,新建了一个word文档,想不好取什么名字,身旁一人惊问:“你出的题目叫《新建Microsoft Word文档》吗?”,L大喜,一拍桌子,说:“好,就叫这个名字了。”

  仔细观察,当你新建一个word文档时,会得到一个名为“新建 Microsoft Word 文档.doc”的文件,再新建一个,则名为“新建 Microsoft Word 文档(2).doc”,再新建,便是“新建 Microsoft Word 文档(3).doc”。不断新建,编号不断递增。倘若你现在新建了三个文档,然后删除了“新建 Microsoft Word 文档(2).doc”,再新建就又会得到一个“新建 Microsoft Word 文档(2).doc”。

  严格说,Windows在每次新建文档时,都会选取一个与已有文件编号不重复的最小正整数作为新文档的编号。

  请编程模拟以上过程,支持以下两种操作

  New:新建一个word文档,反馈新建的文档的编号

  Delete id:删除一个编号为id的word文档,反馈删除是否成功

  初始时一个文件都没有,“新建 Microsoft Word 文档.doc”的编号算作1。

输入格式

  第一行一个正整数n表示操作次数,接下来n行,每行表示一个操作。若该行为”New”,则表示新建,为”Delete id”则表示要删除编号为id的文档,其中id为一个正整数。操作按输入顺序依次进行。

输出格式

  对于输入的每一行,输出其反馈结果。对于新建操作,输出新建的文档的编号;对于删除操作,反馈删除是否成功:如果删除的文件存在,则删除成功,输出”Successful”,否则输出”Failed”。

样例输入

12

New

New

New

Delete 2

New

Delete 4

Delete 3

Delete 1

New

New

New

Delete 4

样例输出

1

2

3

Successful

2

Failed

Successful

Successful

1

3

4

Successful

数据规模和约定

  操作次数(即输入的行数)不超过1481

  删除编号的数值不超过2012

时间限制:1.0s 内存限制:256.0MB

 1 #include<stdio.h>
 2 #include<stdlib.h>            //atoi()函数头文件 
 3 #include<string.h> 
 4 int Exist(int a[],int n,int w)//数组中是否存在某元素 
 5 {
 6     int i;
 7     for(i=0;i<n;i++)
 8     {
 9         if(a[i]==w)
10             return i;//若存在,返回下标值 
11     }    
12     
13     return 0;//不存在,返回0 
14 }
15 
16 int Max(int a[],int n)//求数组的最大值 
17 {
18     int i;
19     int max=a[0];
20     for(i=0;i<n;i++)
21     {
22         if(a[i]>max)
23             max=a[i];
24     }
25     return max;//返回最大值 
26 }
27 
28 int New(int a[],int n)//新建 
29 {
30     int i;
31     if(Max(a,n)==0)//若最大值为0,则表示无文件 
32     {
33         a[n]=1;//数组末添加元素 
34         return 1;//添加成功 
35     }    
36     else//最大值不为0,表示有文件 
37     {
38         for(i=1;i<=Max(a,n);i++)//判断区间[1,max]是否连续? 
39         {
40             if(Exist(a,n,i)==0)//如果有断层 
41             {
42                 a[n]=i;        //将缺少的文件编号  添加到数组末 
43                 return i;    //返回编号 
44             }
45         }
46         a[n]=Max(a,n)+1;    //若区间连续无断层,编号加一,添加元素 
47         return Max(a,n)+1;    //返回编号 
48     }
49 }
50 
51 int Delete(int a[],int n,int w)//删除 
52 {
53     int i;
54     if(Max(a,n)==0)
55         return 0;    //若无文件,删除失败 
56     else
57     {
58         if(Exist(a,n,w)!=0)//有文件,且存在编号 
59         {
60             a[Exist(a,n,w)]=0;//将该编号文件删除 
61             return 1;    //删除成功 
62         }
63         return 0;//有文件,但不存在欲删除的文件编号,删除失败 
64     }
65 }
66 
67 int main()
68 {
69     int n,d,m,i,k=0;//n行数 
70     int a[1500]={0};//a文件编号数组,初始化为0 
71     char b[20],c[4];//b用于存放输入指令字符,c存放Delete n 指令的n 
72     
73     scanf("%d",&n);//输入行数 
74     m=n;//新建操作含n++,防止影响循环判断 
75     while(k++ <= m  && gets(b)!=NULL)//先判断再输入  当前行++  <=  总行数    输入不为空 
76     {
77         if(strcmp(b,"New")==0)//strcmp(str1,str2),判断字符串是否相等,相等返回0 
78         {
79             n++;//数组长度加一 
80             printf("%d\n",New(a,n));//输出新建结果 
81         }
82         
83         else if(strncmp(b,"Delete",6)==0)//strncpy(str1,str2,n) 把str2从n位开始复制到str1 
84         {
85             strncpy(c,b+7,strlen(b));//截取文件编号 
86             int d=atoi(c);//atoi(str) 把字符串转换为整型 
87             if(Delete(a,n,d)==1)
88                 printf("Successful\n");
89             else
90                 printf("Failed\n");
91         }
92     }
93     return 0;
94  } 

若想进一步优化,可以使用动态数组,也可以借鉴Java里set集合的思想。

内存数组不可能无限制增大,可以考虑限制值为0的数组元素个数。