百度2012校招笔试题之位数和编码
算法设计
给定一个数字编码N,大多数情况下可以找到一个数字编码M,其位数与编码N相等(编码可以从0开始),各位数字之和与编码N中各位数字之和相等,并且M是数值大于N的所有码中最小的一个,也可能要找的编码M不存在。
如给定编码N=134,则编码M=143;给定编码N=020,则编码M=101,形式化表述为f(N)=M,如果M不存在,则
f(N)=-1。
现在给定一个起始编码N,
N的数字位数最大不超过1000,N
的数值最大不超过10^500,要求给出序列S(N),其中S(0)=N,S(1)=f(N),S(2)=f(S(1)),S(3)=f(S(2))...,当S(i+1)<0时序列结束,但小于0的元素不包含在序列中,要求给出算法思路和函数。
简要说明:
原题所要求得到序列 按照个人的理解应该为按照以N为最小 从小到大列出符合条件的且f[N]!=-1的数(??)
代码仅供参考 以下代码可以进行适当优化 例如检出明显不符合规则的 以下代码只给出基本做法
int sumfun(char *cn) //因为题目限制 似乎用数字存储可能不合要求 于是传参形式以字符串较为适宜 { int sum=0; for(char *sp=cn;*sp!='\0';sp++) sum+=*sp-'0'; return sum } int SUM =sumfun(cn); //先计算出所给数字的位数和 然后存储在一全局变量中 char *increament(char *cn) { char *dp=cn; for(;*dp!='\0';dp++); dp--; for(;dp!=cn;dp--) { int temp=(*dp-'0'+1); if(temp!=10) { *dp=temp+'0'; break; } *dp='0'; } if(*dp='0' && dp==cn) *cn="done" return cn; } char *fun(char *cn) { char *ssp=cn; int i=0; while(strcmp(*ssp,"done") != 0) { int sum=sumfun(ssp); if(sum==SUM) Printf(ssp); ssp=increament(ssp); } } // 时间复杂度(O(n2))。。。