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

作者: 分类: 代码 时间: 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. 酸性高锰酸钾
    酸性高锰酸钾

    199981不会是答案。199981是一个f(n)=n的一个解,那么显然199982 ~ 199990都是f(n)=n的解。在0x7FFFFFFF的范围内最大的f(n)=n,n好像是1111111110。

    时间: 2012-03-28 08:42
    1. gbfv
      gbfv

      问此后最大的f(n)=n的n是什么?

      时间: 2012-03-28 11:49
      1. 酸性高锰酸钾
        酸性高锰酸钾

        要是n不给范围,恐怕只能用数学的方法去推断了吧

        时间: 2012-03-28 12:06
        1. haha
          haha

          这就是最大的值了,规律如下:
          10的N次方含有的1的个数是N*10的(N-1)方+1

          时间: 2012-06-05 16:59
  2. s
    s

    f(13)怎么等于6呢?求解。。。

    时间: 2012-05-11 11:03
    1. 网上时时彩是骗子
      网上时时彩是骗子

      我觉得是5啊。

      时间: 2012-07-28 23:19
  3. WOAZAA
    WOAZAA

    刚考完C语言的大一新生表示半懂半不懂···

    时间: 2012-05-11 14:31
  4. s
    s

    int类型最大值n是1839279980吧

    时间: 2012-05-12 14:33
  5. sd
    sd

    路过

    时间: 2012-05-15 11:02
  6. symbianXD
    symbianXD

    完全看不懂怎么办~~~

    时间: 2012-05-27 06:35
  7. 范洪洋
    范洪洋

    这是什么课题 我是初中文化

    时间: 2012-06-06 17:29
  8. anonymous
    anonymous

    我一看还以为是要求fibonacci呢.
    呵呵. 下次多思考再回答, 別小看面試題目.

    时间: 2012-06-10 09:31

评论已关闭