今天的面试题做错了,呜呜

作者: 分类: 代码 时间: 2012-03-05 评论: 61条评论

题目是这样的:

有一个整数n,写一个函数f(n),返回0到n之间出现的"1"的个数。比如f(13)=6,现在f(1)=1,问此后最大的f(n)=n的n是什么?

回学校,敲了一下自己当时写的代码,哎呀,错误百出啊。

当时,我是这样写的……

int f(int n,int count)
{
    if(n<10)
    {
        if(n==1) count++;
        return count;
    }
    
    if(n%10==1) count++;
    
    f(n/10,count);
}

int main()
{
    for(int i=1;i<100000;i++)
    {
        if(i==f(f))
        {
            printf("%d\n",i);
            getchar();
        }
    }
}

错到我都不忍心看了。错误点有以下:

1、递归的最终结果没有返回,应该是 return f(n/10,count); 才对。

2、我这个f函数,仅仅是求了n这个数中含的1而已嘛,离题万里。于是加了一个函数:

int f(int n)
{
    int sum = 0;
    for(int i=1;i<=n;i++)
    {
        sum += f(i,0);
    }
    return sum;
}

这个只需要一个参数的f,才是符合题意的f。

3、只是草率的随便写了一个返回去搜索,当然,我现在知道,在这个范围内一个符合要求的值也没有!!

正确的应该从0到0xFFFFFFFF,当然,这个时候不能用int了,而是unsigned int。


即使把这些全部改正过来,搜索效率也依然很低,因为f是一个循环。调用f的也是一个循环。

但是,我们知道n+1,其实就是在n的基础上加上n+1这个数中的1个个数,因此最终代码如下:

#include <windows.h>
#include <stdio.h>

//返回一个数字中包含"1"的个数
unsigned int f(unsigned int n,unsigned int count)
{
    if(n<10)
    {
        if(n==1) count++;
        return count;
    }
    
    if(n%10==1) count++;
    
    return f(n/10,count);
}

//效率低,重复计算,不使用
unsigned int f(unsigned int n)
{
    unsigned int sum = 0;
    for(unsigned int i=1;i<=n;i++)
    {
        sum += f(i,0);
    }
    return sum;
}


int main()
{
    double time = GetCurrentTime();
    unsigned int temp = 0; //保存上次计算结果
    for(unsigned int i=0;i<=0xFFFFFFFF;i++)
    {
        temp = f(i,temp);
        if(i==temp) printf("%u\n",i);
    }
    
    printf("Calc Over! %f",(GetCurrentTime()-time)/1000);
    getchar();
    return 0;
}

我计算的时候终点值是0x7FFFFFFF,因为那时候我没有改成unsigned int。而且已经能够得出答案,不用继续运行浪费时间。

 

还把另外一个不使用库函数实现strcpy的题目做成了实现strcat,我怎么了……o(︶︿︶)o 唉

最后贴一个简化版的代码,结果应该是199981。

#include <stdio.h>

int main()
{
    unsigned int count,num,temp;
    count = num = temp = 0;
    
    while(1)
    {
        temp = num;
        while(temp)
        {
            if(temp%10==1) count++;
            temp /= 10;
        }
        
        if(num==count) printf("%u\n",num);
        num++;
    }
    
    return 0;
}
标签: 面试经验

已有 61 条评论

  1. tingting
    tingting

    代码高亮是什么插件了?非常漂亮

    时间: 2012-03-05 21:38
    1. js2854
      js2854

      貌似是Google Code Prettify
      http://forum.typecho.org/topic.php?id=1915
      项目主页http://code.google.com/p/google-code-prettify/

      时间: 2012-03-06 20:56
      1. July
        July

        我也找到了qfish的这个编辑器,但是我用的是wordpress,不知道怎么实现双击代码复制的效果

        时间: 2012-03-07 17:58
  2. July
    July

    同问啊,代码好好看

    时间: 2012-03-06 07:24
  3. こはく
    こはく

    我厉害啊 围观下 !

    时间: 2012-03-06 11:40
    1. こはく
      こはく

      不好意思 打错字了 是好厉害 我围观你!

      时间: 2012-03-06 11:51
  4. こはく
    こはく

    耍下酱最好去日本那个地方 缺人才!日本百姓很和蔼的!

    时间: 2012-03-06 11:53
  5. 宁波搬家公司
    宁波搬家公司

    博主辛苦了,有空过来看看,支持一下啊

    时间: 2012-03-06 13:45
  6. 黑火
    黑火

    耍下哥,能麻烦看看WIN8版的幽香吗?手动添加也无效。

    时间: 2012-03-06 14:16
  7. win8迷
    win8迷

    你没信春哥

    PS:这个模板不错

    时间: 2012-03-06 22:18
  8. 小杰
    小杰

    回去多拜拜春哥吧!。。。

    时间: 2012-03-06 23:28

评论已关闭