编码问题
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; }