google的一道面试题!(附我的解法)

  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是什么?

我是用C写的,原题要求用java,其实无所谓了,欢迎大家指点:

#include <cstdio>
#include <iostream>

using namespace std;

int F(int num)
{
 int total = 0;
 int one = 1;
 int k = 0;
 for(;num/one!=0; one=one*10, k++);

  int A = 0;
 int B = 0;
 int C = 0;
 int D = 0;
 int E = 0;

 int two = one/10;

 for(; k>0; k--)
 {
     A = num/one;
    B = num%two;
    C = num/two;

    E = C - D*10;
    D = C;

     if (E > 1)
    {
     total += A*two + two;
    }
    else if (E == 1)
    {
     total += A*two + B + 1;
    }
    else if (E == 0)
    {
     total += A*two;
    }

   one = one/10;
    two = two/10;
 }

 return total;

}

int main()
{
   int num;
   while(true)
   {
 
   cout << "Enter: ";
   cin >> num;

   cout << "The total is :" << F(num) << endl ;

  } 

   return 0;
}

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值