删数问题.docx
- 文档编号:2431603
- 上传时间:2022-10-29
- 格式:DOCX
- 页数:14
- 大小:17.73KB
删数问题.docx
《删数问题.docx》由会员分享,可在线阅读,更多相关《删数问题.docx(14页珍藏版)》请在冰豆网上搜索。
删数问题
按高位到低位的顺序搜索,若各位数字递增,则删除最后一个数字;否则删除第一个递减区间的首字母。
键盘输入一个高精度的正整数N(此整数中没有‘0’),去掉其中任意S个数字后剩下的数字按原左右次序将组成一个新的正整数。
编程对给定的N和S,寻找一种方案使得剩下的数字组成的新数最小。
输出应包括所去掉的数字的位置和组成的新的正整数。
(N不超过240位)
输入数据均不需判错。
【输入】
n
s
【输出】
最后剩下的最小数。
【样例输入】
175438
4
【样例输出】
13
代码1:
#include
#include
usingnamespacestd;
stringgreedy(string&str,intn)
{
booldel;
for(inti=n;i>0;i--)
{
del=false;
//每次删除第一个比下一个数字大的数
for(string:
:
iteratorit=str.begin();it!
=str.end()-1;it++)
{
if(*it>*(it+1))
{
str.erase(it);
del=true;
break;
}
}
//如果所有数字递增,则删除最后几个数字直接返回
if(!
del)
{
str.erase(str.end()-i,str.end());
break;
}
}
returnstr;
}
intmain()
{
intn;
stringstr;
cin>>str;
cin>>n;
cout< return0; } 代码2: #include #include #include intmain() { intnum=0; intn; charstr[100]; inta[100]; scanf(“%d”,&num);//数字 scanf(“%d”,&n);//个数 itoa(num,str,10);//转换为字符串 intflag=0;//是否是递增序列 inti; intlength=strlen(str);//长度 intx=length-n; while(length! =x) { flag=0;//递增 for(i=0;i { if((str[i]-’0′)>(str[i+1]-’0′))//比后一个数大删掉 { for(inttemp=i;temp { str[temp]=str[temp+1];//覆盖 } length–; flag=1;//非递增 } } if(flag==0) { length–;//递增序列 删除最后一个 } } inttempFlag=0; if(str[0]==’0′) tempFlag=1;//首位为0不应输出 for(inti=0;i { if(tempFlag==1) tempFlag=0; else printf(“%c”,str[i]); } system(“pause”); } 代码3: #include #include voidfind() { charN[200]; ints; inti=0,j; printf("inputthenumber: "); scanf("%s",N); printf("\ninputtimes: "); scanf("%d",&s); while(s>0)/*循环减s次*/ { i=0;/*每次删除后重头开始*/ while(i for(j=i;j s--; } printf("%s",N); } intmain() { find(); system("pause"); } 代码4: #include intsel(int); intsum,len,in[20]; voidmain() { intinput,num; printf("【输入】\n"); scanf("%ld",&input); scanf("%d",&num); inti=0; for(;input! =0;i++) { in[i]=input%10; input/=10; } len=i; if(-1==(sum=sel(num))) return; printf("【输出】\n%d\n",sum); } intsel(intn) { intj,k,l,m; switch(len-n) { case0: sum=0; break; case1: sum=in[0]; for(j=0;j sum=sum>in[j]? in[j]: sum; break; case2: sum=in[1]*10+in[0]; for(j=0;j { for(k=j+1;k { sum=sum>(in[k]*10+in[j])? (in[k]*10+in[j]): sum; } } break; case3: sum=in[2]*100+in[1]*10+in[0]; for(j=0;j { for(k=j+1;k { for(l=k+1;l { sum=sum>(in[l]*100+in[k]*10+in[j])? (in[l]*100+in[k]*10+in[j]): sum; } } } break; case4: sum=in[3]*1000+in[2]*100+in[1]*10+in[0]; for(j=0;j { for(k=j+1;k { for(l=k+1;l { for(m=l+1;m { sum=sum>(in[m]*1000+in[l]*100+in[k]*10+in[j])? (in[m]*1000+in[l]*100+in[k]*10+in[j]): sum; } } } } break; case5: case6: default: printf("输入错误或超限! \n"); return-1; } returnsum; } 代码5: #include"stdafx.h" #include"conio.h" #include"string.h" #definestrMax1000 voidGreedDelNumber(charstr[],intlen,ints) { // //for(inti=0;i //printf("%c",str[i]); //printf("\n"); if(s==0) { charnum[strMax]={0}; intj=0; for(inti=0;i { if(str[i]! =0) num[j++]=str[i]; } strcpy(str,num); } else { for(inti=0;i { intj=i+1; while(str[j]==0&&j j++; if(j>=len||str[i]>str[j]) { str[i]=0; GreedDelNumber(str,len,s-1); return; } } } } int_tmain(intargc,_TCHAR*argv[]) { charstr[]="41235"; ints=2; printf("原数为: %s\n",str); printf("长度为: %d\n待删数: %d\n",strlen(str),s); GreedDelNumber(str,strlen(str),s); printf("删除后: %s\n",str); getch(); return0; } 代码6: #include usingnamespacestd; constintLimit_Size=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 问题