f(n) = n

题目: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.

请大家写出自己的算法,并统计一些在你机器上计算出1111111110的时间。为了不影响大家的思路,我最后贴上我的程序。

语言不限,随便了。

这里我只用程序逻列了所有f(n) = n时n的值
程序如下:

ExpandedBlockStart.gif ContractedBlock.gif /**/ ///jailusd@hotmail.com
ExpandedBlockEnd.gif
///2006-09-09

None.gif
ExpandedBlockStart.gifContractedBlock.gif
/**/ /*
InBlock.gif * 题目:;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. 
InBlock.gif
InBlock.gifFor example, f(13)=6. Notice that f(1)=1. What is the next largest n such that f(n)=n?
InBlock.gif
InBlock.gif翻译过来大体是这样:
InBlock.gif有一个整数n,写一个函数f(n),返回0到n之间出现的"1"的个数。比如f(13)=6,现在f(1)=1,问下一个最大的f(n)=n的n是什么?
InBlock.gif
InBlock.gif为什么f(13)=6, 因为1,2,3,4,5,6,7,8,9,10,11,12,13.数数1的个数,正好是6.
InBlock.gif
InBlock.gif请大家写出自己的算法,并统计一些在你机器上计算出1111111110的时间。为了不影响大家的思路,我最后贴上我的程序。
InBlock.gif
InBlock.gif语言不限,随便了。
ExpandedBlockEnd.gif 
*/

None.gif
None.gif
using  System;
None.gif
using  System.Collections.Generic;
None.gif
using  System.Text;
None.gif
None.gif
namespace  ping4210_1
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
class Program
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
static void Main(string[] args)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            Count();
InBlock.gif
InBlock.gif            Console.ReadLine();
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
static void Count()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
long N = 1;
InBlock.gif            
bool bl = true;
InBlock.gif            
int intCount = 0;
InBlock.gif
InBlock.gif            
int intTemp = 0;
InBlock.gif
InBlock.gif            
//核心代码
InBlock.gif
            while (bl)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                intTemp 
= 0;
InBlock.gif                
char[] chara = N.ToString().ToCharArray();
InBlock.gif
InBlock.gif                
for (int i = 0; i < chara.Length; i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    
if (chara[i] == '1')
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
dot.gif{
InBlock.gif                        intTemp
++;
ExpandedSubBlockEnd.gif                    }

ExpandedSubBlockEnd.gif                }

InBlock.gif
InBlock.gif                intCount 
+= intTemp;
InBlock.gif
InBlock.gif                
if (intCount == N)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    Console.WriteLine(N.ToString());
ExpandedSubBlockEnd.gif                }

InBlock.gif
InBlock.gif                N
++;
InBlock.gif
InBlock.gif                
//为防止溢止设为N == long.MaxValue
InBlock.gif
                if (N == long.MaxValue)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    bl 
= false;
ExpandedSubBlockEnd.gif                }

ExpandedSubBlockEnd.gif            }

InBlock.gif
InBlock.gif            Console.WriteLine(
"运行结束!");
InBlock.gif            Console.WriteLine();
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif

以下是部分运行结果:
1
199981
199982
199983
199984
199985
199986
199987
199988
199989
199990
200000
200001
1599981
1599982
1599983
1599984
1599985
1599986
1599987
1599988
1599989
1599990
2600000
2600001
13199998
35000000
35000001
35199981
35199982
35199983
35199984
35199985
35199986
35199987
35199988
35199989
35199990
35200000
35200001
117463825

转载于:https://www.cnblogs.com/jailu/archive/2006/09/09/499853.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值