百度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))。。。

 

posted on 2012-07-13 13:45  as_  阅读(1041)  评论(1编辑  收藏  举报

导航