1. 程式人生 > >新建Microsoft Word文檔

新建Microsoft Word文檔

最大值 區間 截取 觀察 缺少 mic 依次 字符串 str2

問題描述   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的數組元素個數。

新建Microsoft Word文檔