一个长整数串去除m位使其最大

要求:输入一个长串整数,小于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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值