google的一道面世题:(f(n)==n)

原创 2006年06月09日 21:13:00

 

原贴地址:

http://community.csdn.net/Expert/topic/4211/4211591.xml?temp=.9405329

这个题目的英文原题是:
Consider a function which, for a given whole number n, returns the number of ones required when writing out all numbers between 0 and n.

For example, f(13)=6. Notice that f(1)=1. What is the next largest n such that f(n)=n?

翻译过来大体是这样:
有一个整数n,写一个函数f(n),返回0到n之间出现的"1"的个数。比如f(13)=6,现在f(1)=1,问下一个最大的f(n)=n的n是什么?

为什么f(13)=6, 因为1,2,3,4,5,6,7,8,9,10,11,12,13.数数1的个数,正好是6.

#include<iostream.h>
/*
这是我最初编的,速度太慢了。
int f10(int n){
 int r=1;
 for(int i=1;i<=n;i++)
  r=r*10;
 return r;
}

int f(int n){
 int r=0;
 for(int i=1;i<=n;i++){
  int a=1;
  do{
   if(i%f10(a)/f10(a-1)==1)
    r++;
   a++;
  }while(i/f10(a-1)!=0);
 }
 return r;
}
*/
/*
这是比较快的答案之一,但是看不懂。
int f(int n)
{
  int ret = 0;
  int ntemp=n;
  int ntemp2=1;
  int i=1;
  while(ntemp)
  {
    ret += (((ntemp-1)/10)+1) * i;
    if( (ntemp%10) <= 1 )
    {
      ret -= i;
    }
    if( (ntemp%10) ==1 )
    {
      ret += ntemp2;
    }
    ntemp = ntemp/10;
    i*=10;
    ntemp2 = n%i+1;
  }
  return ret;
}
*/

int f(int n){
 static int r=0;
 do{
  if(n%10==1) r++;
  n=n/10;
 }while(n);
 return r;
}

int main(){
 for(long i=1; i<=1111111110;i++)
  if(f(i)==i)
   cout<<i<<endl;
 cout<<"the end"<<endl;
 return 0;
}


蓝色部分的算法代码是我最初写的,算出下一个n要N长时间。哎……,看来还要继续努力啊!!!!

更新:我自己写的新算法,用一个静态变量来进行统计,遍历算出1111111110内的所有f(n)==n总共用14分钟,机器P4 1.8G 256M win2000.

那些吹几毫秒之内算出来的全是假的,不信请执行以下代码

#include<iostream.h>

int main(){
 for(long i=1; i<=1111111110;i++);
   cout<<"the end"<<endl;
 return 0;
}

在我的机器上要过4秒左右才会出现 the end.

hdu 2583 f(n) 做的迷迷糊糊的一道题

f(n) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub...

Google的一道面试题的推广(扔鸡蛋不破的层数,2个,3个,n个鸡蛋呢)

Google的面试题在论坛炒得很火,今年题目如下:“有一个100层高的大厦,你手中有两个相同的玻璃围棋子。从这个大厦的某一层扔下围棋子就会碎,用你手中的这两个玻璃围棋子,找出一个最优的策略,来得知那个...

projecteuler486题F5(n)的实现

projecteuler486题F5(n)的实现

Google面试算法题:《从1到n的正数中1出现的次数》的求解

问题描述: 在从1到n的正数中1出现的次数(数组) 题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。 例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12...

每天一道算法题(15)——打印1到最大的n位数

题目:             打印1到最大的n位数。如n=4,打印1-9999。 思路:        由于直接使用循环会导致int或者long long都不够存储。因此使用字符串来存储数据,这...

Python解一道题的N种做法(1)

题目描述:Check to see if a string has the same amount of 'x's and 'o's. The method must return a boolean...
  • ggGavin
  • ggGavin
  • 2016年02月28日 23:46
  • 1027

Python解一道题的N种做法(2)

一道题的N种做法
  • ggGavin
  • ggGavin
  • 2016年02月29日 12:28
  • 935

一道排序笔试题,在o(n)时间内对一个数组进行排序

题目:某公司有几万名员工,请完成一个时间复杂度为O(n)的算法对该公司员工的年龄作排序,可使用O(1)的辅助空间。 分析:估计有很多人应该都看过这个题目,仅仅作为自己面试找工作的一个记录哈,大家见笑...

每日一道算法题:一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值

题目:一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值。           比如{3,2,4,3,6}可以分为{3,2,4,3,6},     m = 1;          ...
  • jhyxss
  • jhyxss
  • 2014年12月08日 17:58
  • 497

微软的一道经典逻辑推理题:小明和小强都是张老师的学生,张老师的生日是M月N日

转自:http://blog.csdn.net/archimedes_zht/article/details/2784958 题目是这样的: 小明和小强都是张老师的学生,张老师...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:google的一道面世题:(f(n)==n)
举报原因:
原因补充:

(最多只允许输入30个字)