删数问题
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
问题描述:
给定的n位正整数a,去掉其中任意k<=n个数字后,剩下的数字按原次序排列组成一个新的正整数。对于给定的n位正整数a和正整数k,设计一个算法找出剩下数字组成的新数最小的删除方案。
比如你输入: 178543
再次输入: 4
那么将得出的正确答案是: 13
算法分析:
我们删除数字时,应从高位开始删除,例如上面的范例数字178543,要从中删除4位数字使得剩下的数字最小,那么第一个应该删除的是数字8,然后删除的是7,再然后就是5,最后删除的是4,最终看到结果就是13。基于此想法,并总结出规律:按高位到低位的顺序搜索,若各位数字递增,则删除最后一个数字;否则删除第一个递减区间的首字符,这样删一位便形成了一个新的数字串。然后回到串首,按上述规则再删除下一个数字。
代码如下:
#include
#include
void main()
{
char a[200]; //定义字符数组,最多可以存放200个数字
unsigned int n,i,j;
printf("请输入数字:\n");
scanf("%s",a);
printf("请输入要删除的位数:\n");
scanf("%d",&n);
if(n>=strlen(a)) //如果要删除的位数大于等于输入的数字位数,那么答案就是0
{
printf("0\n");
return;
}
while(n>0)
{
i=0; //每次开始将i初始化为0,表示重新开始检测下降点
while(i i++; for(j=i;j a[j]=a[j+1]; n--; } printf("%s\n",a); //输出最终的结果 }