一開始我也注意到了如果后面的數比這個數大,那么該數刪去,最后也考慮到了是整體重復s次而不是從左到右刪s個,以及連續的相等數卡了一會.還有最后的0問題....總結,有思考,思考欠佳.
#include<cstdio>
#include<cstring> //格式化輸入輸出頭檔案和字串頭檔案
char n[250]; //利用字符陣列來儲存高精度數
int s,i,len,flag=1;
int main()
{
while (scanf("%s%d",n,&s)!=EOF){
flag=1;
len=strlen(n);
//int len1=len; //這里是長度函式,取n的長度并賦值給len
while(s!=0) //只要s不是0,取數的作業就沒有做完!
{
i=0;
while(n[i]<=n[i+1]) //括號內的條件保證了不降序的條件,當它退出時,就是升序數列的末尾了
//注意 字串末尾為\0 這一點很巧妙
i++;
while(i<len-1) //這時已經找到了要取出的數——n[i],這是取出的程序
{n[i]=n[i+1];i++;} //其實這個回圈可以用erase(i,1);代替
//瘋狂替代.
len--; //取出后數字長度減1
s--; //消耗掉一次取出次數
}
for(int i=0;i<len;i++) //輸出時要小心最高位是0的問題!處理輸出……
{
if(n[i]=='0'&&i<len-1&&flag==1) //如果即將輸出的這一位是0且是最高位而且不是最后一個
continue; //跳過
else
{printf("%c",n[i]);flag=0;}//輸出并且明確n[i]不再是最高位
}
printf("\n");
// for(int i=0;i<len1;i++){
// printf("%c ",n[i]);
// }
}
return 0;
}
uj5u.com熱心網友回復:
沒看明白具體要實作什么功能?可以利用冒泡排序的思路洗掉后面大的資料
uj5u.com熱心網友回復:
問題描述:給定n位正整數a,去掉其中任意k<=n個數字后,剩下的數字按原次序排列組成一個新的正整數,對于給定的n位正整數a和正整數k,設計一個演算法找出剩下數字組成的新數最小的刪數方案。對于給定的正整數a,編程計算刪去k個數字后得到的最小數。
輸入檔案示例:
178543
4
輸出檔案示例:
13
2.相關演算法:
#include<stdio.h>
#define M 6
int main(){
int arr[]={1,7,8,5,4,3};
int arrMark[]={0,0,0,0,0,0};//用作標記的陣列,成員記為1表示洗掉,記為0表示未洗掉
int delNum;//要洗掉的個數
int i;
int j;
int next=0;//記錄下一個未標記洗掉的下標
scanf("%d",&delNum);//輸入要洗掉的數量
for(i=0;i<delNum;i++){
for(j=0;j<M;j++){
if(j==M-1) {//如果是最后一個元素,那么直接洗掉即可
arrMark[j]=1;
break;
}
while(next<=j||arrMark[next]==1){//找到下一個未標記洗掉的下標
next++;
}
if(arrMark[j]!=1&&arr[j]>arr[next]){//如果發現降序,則洗掉
arrMark[j]=1;
break;
}
}
next=0;
}
for(i=0;i<M;i++){//輸入未標記洗掉的陣列元素
if(arrMark[i]!=1)
printf("%d",arr[i]);
}
}
3.問題分析與解題思路:
數位越高,對數字最終的大小的影響會越大,因此最好洗掉數位比較高的數字。而且如果是相鄰數字之間洗掉比較大的數字,最終的結果會比較小。因此我們可以從最高位開始找,找到第一個比自己下一位數字大的數字進行洗掉。每次都這樣處理,最終就可以得到目標結果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/17492.html
標籤:基礎類
下一篇:機房管理查詢系統設計與實作
