jinhao7773的专栏

不存在十全十美的文章 如同不存在彻头彻尾的绝望

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

 

原贴地址:

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.

阅读更多
个人分类: C/C++
上一篇C++的背影——C++之父Bjarne Stroustrup印象
下一篇用1到9这几个数字做一个运算。
想对作者说点什么? 我来说一句

有关c语言程序的一道

2008年12月24日 361B 下载

没有更多推荐了,返回首页

关闭
关闭