编码问题

Q:有这样一种编码:如,N=134,M=f(N)=143,N=020,M=fun(N)=101,其中N和M的位数一样,N,M可以均可以以0开头,N,M的各位数之和要相等,即1+3+4=1+4+3,且M是大于N中最小的一个,现在求这样的序列S,N为一个定值,其中S(0)=N,S(1)=fun(N),S(2)=fun(S(1))


A:要求一个数n的f(n),并且要符合位数相等,各位之和也要相等,并且是大于n中的最小的一个。

我们首先考虑将数字转化为字符串,字符串的开始是数字的高位,字符串的末尾是数字的低位。然后从字符串末尾往前扫描,找出第一个大于0的数字,将其减1,然后继续往前找,找到第一个小于9的数字,将其加1,然后,在该位之后到末尾,重新排序,即可得所求结果。

#include <iostream>
#include <cstdlib>
#include <algorithm>
using namespace std;
int Func(char* n)
{
	int digit_num=strlen(n);
	char *str=n;
	int minus_index=digit_num-1;
	int add_index;
	while(minus_index>=0 && str[minus_index]=='0')
		minus_index--;
	if(minus_index>=0)
	{
		add_index=minus_index-1;
		while(add_index>=0 && str[add_index]=='9')
			add_index--;
		if(add_index>=0)
		{
			str[add_index]=(char)(str[add_index]+1);
			str[minus_index]=(char)(str[minus_index]-1);
			sort(str+add_index+1,str+digit_num);
		}
	}
	return atoi(str);
}

int main()
{
	char n[50];
	while(cin >>n)
		cout <<Func(n)<<endl;
	return 0;
}
posted @ 2012-07-21 09:28  Cavia  阅读(453)  评论(1编辑  收藏  举报