要求:输入一个长串整数,小于240位,去除其中的位然后使这个数最大
一种错误的解法:遍历这个字符串,删除其最小的m位。
如128953,去除3位,若按上面的算法,则为895,之所以是错的,因为953比895大。
所以一种正确的算法如下:
1.原字符串长度为n,删除m个,最终为n-m
2最终的字符串以大字符为排头,即从大到小(c:9-->0)开始查找字符,并计算其后的字符串长度,若大于n-m,则说明这个字符要输出,若长度小于n-m,则它不能作为开头,从而查看下一个比较小的。
3.每输出一个字符,把输出长度减一,并下一次从它的后面开始搜索,同时c也从9开始,重复2
4.重复3,直到最终长度n-m为0;
/* Note:Your choice is C IDE */
#include "stdio.h"
#include<assert.h>
#include<string.h>
/** 输入一个长串整数,小于240位,去除其中的n位然后使这个数最大 */
void Del_m_to_max(char *src,int m,char *dest)
{
int n;
int output_len;//剩余输出的长度
int curlen;//现有的长度;
char c;
char *p,*cur=src;
assert(src!=NULL&&dest!=0);
n=strlen(src);
assert(n>m);
output_len=n-m;
*dest='\0';
while(output_len>0)//output_len=0时,则输出
{
for(c='9';c>='0'&&output_len>0;)
{
p=strchr(cur,c);
if(NULL==p)//没有大字符,看次大字符
{
c--;
continue;
}
curlen=strlen(p);
if(curlen<output_len)//长度不够了,
{
c--;
continue;
}
/*加入这个elseif可以少好一些判断,而不是每个字符都要判断。*/
else if(curlen==output_len)
{
*dest='\0';
strcat(dest,p);
output_len=0;
break;
}
else
{
//printf("in\n");
*(dest++)=*p;
output_len--;
cur=p+1;
c='9';//下一个字符,又要从头开始。
}
}
}
//if()*dest='\0';
}
void main()
{
char buf[]="83179254297017652";//"128953";
// 128953
char dest[240];
Del_m_to_max(buf,10,dest);
printf("%s\n",dest);
}
9977652
Press any key to continue
转载请标明出处: http://blog.csdn.net/lin200753/article/details/27851137