演算法題—n位正整數去掉k(k
阿新 • • 發佈:2019-01-06
問題描述:給定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。