zoukankan      html  css  js  c++  java
  • 百度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))。。。
  • 相关阅读:
    JS 博客园鼠标点击效果
    安卓socket聊天
    抖音C#版,自己抓第三方抖音网站
    C#网易云音乐播放器
    反编译APK
    Raspberry Config.txt 介绍
    Raspberry U盘操作
    排序(I)
    未解决问题:
    CocoaPod 问题(I)
  • 原文地址:https://www.cnblogs.com/biyeymyhjob/p/2590107.html
Copyright © 2011-2022 走看看