键盘输入一个高精度的正整数n(≤100位),去掉其中任意s个数字后剩下的数字按照原来的左右次序组成一个新的正整数。
编程对给定的n与s,寻找一种方案,使得剩下的数字组成的新数最小。
输入格式:
输入两个数字,分别为原始数n,要去掉的数字数s (s < n);
输出格式:
输出去掉s个数后最小的数。
178543 4
13
看例子 178543 删4个数 如何删呢? 8-7-5-4 13
再来一个 41276 删3个 如何删呢? 4-7-6 12
有什么规律呢?
“最近下降点”优先,即每次找到第一个元素,使其满足大于下一个元素。先找到递增数的最后一个数,删除,再找下一个数,保证了每一次均为最小数。
代码:
#include<stdio.h>
#include<string.h>
char n[250]; //利用字符数组来储存高精度数
int s,i,len,flag=1;
int main()
{
scanf("%s %d",n,&s);
len=strlen(n); //这里是长度函数,取n的长度并赋值给len
while(s!=0) //只要s不是0,取数的工作就没有做完!
{
i=0;
while(n[i]<=n[i+1]) //括号内的条件保证了不降序的条件,当它退出时,就是升序数列的末尾了
i++;
while(i<len-1) //这时已经找到了要取出的数——n[i],这是取出的过程
{n[i]=n[i+1];i++;}
len--; //取出后数字长度减1
s--; //消耗掉一次取出次数
}
for(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]不再是最高位
}
return 0;
}
pta能过