免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: yzc2002
打印 上一主题 下一主题

据说是google的面试题,看谁的快 [复制链接]

论坛徽章:
0
61 [报告]
发表于 2006-04-04 11:46 |只看该作者

lz果然强人啊

可以证明楼主是对的
但我算到3500001就算不下去了,太慢
期待正解
#include <iostream.h>
#include "conio.h"
long exp(int m,int k)
{
        int n=1;
        if( k == 0 )
                n = 1;
        else
                for(int i=1;i<=k;i++)
                        n *=m;
        return n;
}
int main()
{
        int n;
        cout<<"Input n:";
        cin>>n;
        int m = 0;
        for (int i=1;i<=n;i++)
        {
            for(int j=1;exp(10,j-1)<=i;j++)
            {
                if(i%exp(10,j)/exp(10,j-1)==1)
                   m++;

            }
            if(m == i)
                cout<<m<<endl;

        }
        //cout<<m<<endl;
       _getch();
}

论坛徽章:
0
62 [报告]
发表于 2006-04-04 13:46 |只看该作者
高手呀,我真是佩服的五体投地了.
说算法我不懂,说数学我不精.看来我也只有默默的灌水了.请大家谅解.

论坛徽章:
0
63 [报告]
发表于 2006-04-04 16:09 |只看该作者
原帖由 bleem1998 于 2006-3-29 12:14 发表
写了个伪的
大伙指正
[code]
//计算一个整数里还有多少个1,有几个返回几
int num_a_int(int papapa)
{
        //这个函数对谁来说都easy吧
        return 0;
}

//这个函数就是题目里要求的那个函数 ...



有见的。不错,用的是函数递归吧。

论坛徽章:
0
64 [报告]
发表于 2006-04-04 18:18 |只看该作者

这个问题很简单

构造一个函数 num(int x),此函数返回数字x中所含“1”的个数。
那么当n>1时根据定义有
f(n) = f(n-1)+num(n) ;


y=0;
for(i=1;i<=n;i++)
  y+=num(i);

程序的时间复杂度为O(n);空间复杂度为O(1);

论坛徽章:
0
65 [报告]
发表于 2006-04-08 11:51 |只看该作者
#include <iostream.h>
#include <conio.h>
void main()
{
       int n = 1 , b = 9 , m = 1 , p = 10 , x = 0 , k = 0;        // m是n的位数,p是10的m次方
       for( ; n < 9999999999; n++ )
       {
              if( b = 0 )              // b=0时,n恰好为10的整数倍,算得n中1的个数为k,则n+1中有 K+1 个1......
              {                                                                    //  n+2,n+3.....n+9 中各有 k 个1
                    if( n == p )                                              // 如果n等于p,位数m加1,相应的p值改变
                    {
                           m++; p *= 10;
                    }      
                    k = 0;
                    int ln = n / 10, lp = p;
                    for( ; m > 0 ; m-- )
                    {
                           if(ln % lp / ( lp / 10 ) == 1 )
                           k++;
                           lp /= 10;
                    }
             }
              else
              {
                    if( b = 9 )  { x += k+1;  b-- }
                    x += k; b--;
              }
              if( x == n )   { cout << n << endl; }
       }
}

c++ builder 环境下运行,没有调试过,不知道速度怎样!
不过应该不错吧,哈哈,昨天想了一个晚上,哪位兄弟在机子上运行下帮我看看啊!

[ 本帖最后由 marinekiller 于 2006-4-8 22:47 编辑 ]

论坛徽章:
0
66 [报告]
发表于 2006-04-08 20:12 |只看该作者
再次思考中。。。

[ 本帖最后由 wobushiwo 于 2006-4-8 20:34 编辑 ]

论坛徽章:
0
67 [报告]
发表于 2006-04-09 10:48 |只看该作者

怎么我算了个199992?能帮忙看下吗?

#include <cstdlib>
#include <iostream>
using namespace std;

int incone( int n)
{
    int i=0;
    do
    {
          if ( n%10 == 1 )
              {i++;}
           n=n / 10;
    }
    while ( n > 0);
//    cout << i <<endl;
    return i;
}

int main(int argc, char *argv[])
{
    int i=1,m,n=2;
    while (i != n )
    {
        i+=incone(n);
        n++;           
    }
    printf("%d\n", i);
   
    system("PAUSE");
    return EXIT_SUCCESS;
}

论坛徽章:
0
68 [报告]
发表于 2006-04-09 11:21 |只看该作者

发现错误及时更正

do
    {
        i+=incone(n);
    }while (i != n++ );

论坛徽章:
0
69 [报告]
发表于 2006-04-09 22:46 |只看该作者

改进一下哈,受到 gaoas 启发

#include <iostream.h>
#include <conio.h>
void main()
{
       int n = 1 , b = 9 , x = 0 , k = 0;        // m是n的位数,p是10的m次方
       for( ; n < 9999999999; n++ )
       {
              if( b = 0 )              // b=0时,n恰好为10的整数倍,算得n中1的个数为k,则n+1中有 K+1 个1......
              {                                                                    //  n+2,n+3.....n+9 中各有 k 个1
                                       
                    k = 0;
                    int ln = n , lp = p;
                    for( ; ln > 0 ;  )
                    {
                           if(ln % 10 ) == 1 )
                           k++;
                           ln /= 10;
                    }
             }
              else
              {
                    if( b = 9 )  { x += k+1;  b-- }
                    x += k; b--;
              }
              if( x == n )   { cout << n << endl; }
       }
}

c++ builder 环境下运行,没有调试过,不知道速度怎样!
不过应该不错吧,哈哈,昨天想了一个晚上,哪位兄弟在机子上运行下帮我看看啊!

论坛徽章:
0
70 [报告]
发表于 2006-04-10 09:27 |只看该作者

我这个如何呀?好象也不快呀:(

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <string.h>

static int dig_1 =0;

int my_fun(const int i)
{
    char a[100];
    int len;

    memset(a,0x00,100);
    itoa(i,a,10);

    len = strlen(a);
    while(len>=0)
    {
       if(a[--len]=='1')
          dig_1++;
    }
    return dig_1;
}

void main()
{
    int n=1;
    while(1)
    {
        if(my_fun(n) == n)
            printf("%d  \n",n);
        n++;
    }
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP