1. 程式人生 > >第四章上機實踐報告

第四章上機實踐報告

一:實踐題目:

 刪數問題 (110 分)

給定n位正整數a,去掉其中任意k≤n 個數字後,剩下的數字按原次序排列組成一個新 的正整數。對於給定的n位正整數a和正整數 k,設計一個演算法找出剩下數字組成的新數最 小的刪數方案。

輸入格式:

第 1 行是1 個正整數 a。第 2 行是正整數k。

輸出格式:

輸出最小數。

輸入樣例:

在這裡給出一組輸入。例如:

178543 
4 

輸出樣例:

在這裡給出相應的輸出。例如:

13

二:問題描述:

使用貪心演算法的思想每次選擇從頭開始遞增的數字中最大的數字  即一定範圍內最大的 但不一定是整個數中最大的最後全部刪除完之後處理一下字首零的問題就過了.

三、演算法描述

 

每次選擇從頭開始遞增的數字中最大的數字,刪除後將向前移一位;考慮第一位是0的情況進行判斷,若第一位是0則輸出0,若刪除後得到的整數第一位是0則刪除0向前移一位.

 


部分程式碼如下:

int i ,len ,n;
char s[110];
while(scanf("%s %d",s,&n)!=EOF)
{
while(n)
{
len = strlen(s);
i = 0;
while(i<len&&s[i]<=s[i+1])
i++;
while(i<len)
{
s[i] = s[i+1];
i++;
}
n--;
}
while(s[0]=='0')
{
while(i<len)
{
s[i]= s[i+1];
i++;
}
i = 0;
}
if(s[0]=='\0')
printf("0\n");
else
printf("%s\n",s);

四、演算法時間及空間複雜度分析

 

時間複雜度: = O(N)

空間複雜度: O(N)

 

 

五、心得體會(對本次實踐收穫及疑惑進行總結)

和隊友一起做題,在第三題的時候犯了小錯誤,在迴圈條件內輸出導致部分錯誤,第一第二題在討論後很快就得出思路並且解決問題了。