1. 程式人生 > >演算法題—n位正整數去掉k(k

演算法題—n位正整數去掉k(k

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

對於給定的正整數a,程式設計計算刪去k個數字後得到的最小數。

輸入:多組測試資料,每組測試資料的第一行是1個正整數a(a<10^100),第二行是正整數k(k<1000)

輸出:刪掉個數字後的最小數,每組測試資料輸出單獨一行,如果首位數字為0,刪除首位數字。

#include <stdio.h>
#define MAX 10000000
int num[MAX];

//返回刪除的位置
int deleteNum(int a[],int n)
{
    int i,j;
    for(i=n-1,j=i-1;i>0;i--)
    {
        //printf("\n%d %d",a[i],a[j]);
        if(a[i]>a[j])
        {
            //printf("\n%d\n",i);
            return i;
        }
        else j--;
    }
    return i;
}

int main(int argc, const char * argv[]) {
    // insert code here...
    //printf("Hello, World!\n");
    
    int i,n,k,j,flag[1000];
    long a;
    scanf("%ld",&a);
    scanf("%d",&k);
    i=0;
    while(a)
    {
        num[i++]=a%10;
        a=a/10;
    }
    n=i;
/*printf("\n%d\n",n);
    for(i=0;i<n;i++)
    {
        printf("%d ",num[i]);
    }
    //printf("\nn=%d",n);
 */
    for(i=0;i<k;i++)
    {
        flag[i]=deleteNum(num,n);
         //刪除操作
        for(j=flag[i];j<n-1;j++)
        {
            num[j]=num[j+1];
        }
        n--;
    }
    //printf("\nn=%d\n",n);
    for(i=n-1;i>=0;i--)
    {
        printf("%d",num[i]);
    }
    printf("\n");
    return 0;
}
輸入輸出樣例:



輸入:a=178534;k=2;輸出:1534;

輸入:a=178534;k=4;輸出:13。