f(n) = n的优化(一)

优化f(n)=n算法
本文分享了一个关于求解f(n)=n问题的优化算法,该算法通过统计0到n之间数字1出现的次数来寻找满足条件的n值。经过优化后,算法运行时间显著减少。

在上篇文章f(n) = n中,逻列了满足f(n) = n的N的值列表,今天对算法进行了优化,运算速度从原来的00:12:24.5781250减少到00:02:03.2031250,快了10分21秒,呵呵,看来算法的不同带来的效率也是完全不一样的!

代码如下:点击下载运行文件

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

ExpandedBlockStart.gif ContractedBlock.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            DateTime dtStart 
= DateTime.Now;
InBlock.gif            DateTime dtEnd;
InBlock.gif
InBlock.gif            TimeSpan ts;
InBlock.gif            
double count;
InBlock.gif
InBlock.gif            Int32 N 
= 1;          //自然数N
InBlock.gif
            bool bl = true;
InBlock.gif            
int intCount = 0;     //1的总个数
InBlock.gif

InBlock.gif            
int intTemp = 0;      //当前数字含1的个数
InBlock.gif
            int a,b;
InBlock.gif
InBlock.gif            Console.WriteLine(
"满足f(n) = n的n值列表:");
InBlock.gif
InBlock.gif            
//核心代码
InBlock.gif
            while (bl)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
if (N % 10 == 1)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    intCount
++;
ExpandedSubBlockEnd.gif                }

InBlock.gif                
else if (N % 10 == 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    intTemp 
= 0;    //统计1的个数
InBlock.gif

InBlock.gif                    b 
= N;
InBlock.gif                    
while (b > 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
dot.gif{
InBlock.gif                        a 
= b % 10;
InBlock.gif                        
if (a == 1)
ExpandedSubBlockStart.gifContractedSubBlock.gif                        
dot.gif{
InBlock.gif                            intTemp
++;
ExpandedSubBlockEnd.gif                        }

InBlock.gif                        b 
= (b - a) / 10;
ExpandedSubBlockEnd.gif                    }

ExpandedSubBlockEnd.gif                }

InBlock.gif
InBlock.gif                intCount 
+= intTemp;
InBlock.gif
InBlock.gif                
//判断N值是否与1的个数相等
InBlock.gif
                if (intCount == N)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    Console.WriteLine(N.ToString());
InBlock.gif
InBlock.gif                    
//显示当前计算时间
InBlock.gif
                    ts = DateTime.Now.Subtract(dtStart);
InBlock.gif                    count 
= ts.TotalMilliseconds;
InBlock.gif                    Console.WriteLine(
"Total Time:\t" + ts);
InBlock.gif                    Console.WriteLine();
ExpandedSubBlockEnd.gif                }

InBlock.gif
InBlock.gif                
//当N值等于多少时停止程序11111111111
InBlock.gif
                if (N == 11111111111)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    bl 
= false;
ExpandedSubBlockEnd.gif                }

InBlock.gif
InBlock.gif                N
++;
ExpandedSubBlockEnd.gif            }

InBlock.gif            
//核心代码结束
InBlock.gif
InBlock.gif            
//显示最张运行时间
InBlock.gif
            dtEnd = DateTime.Now;
InBlock.gif
InBlock.gif            ts 
= DateTime.Now.Subtract(dtStart);
InBlock.gif            count 
= ts.TotalMilliseconds;
InBlock.gif
InBlock.gif            Console.WriteLine();
InBlock.gif            Console.WriteLine(
"Start Time:\t" + dtStart);
InBlock.gif            Console.WriteLine(
"End Time:\t" + dtEnd);
InBlock.gif            Console.WriteLine(
"Total Time:\t" + ts);
InBlock.gif
InBlock.gif            Console.WriteLine(
"运行结束!");
InBlock.gif            Console.WriteLine();
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif


最后运行结果如下:
满足f(n) = n的n值列表:
1
Total Time:     00:00:00

199981
Total Time:     00:00:00.0156250

199982
Total Time:     00:00:00.0156250

199983
Total Time:     00:00:00.0156250

199984
Total Time:     00:00:00.0156250

199985
Total Time:     00:00:00.0156250

199986
Total Time:     00:00:00.0156250

199987
Total Time:     00:00:00.0156250

199988
Total Time:     00:00:00.0156250

199989
Total Time:     00:00:00.0156250

199990
Total Time:     00:00:00.0156250

200000
Total Time:     00:00:00.0156250

200001
Total Time:     00:00:00.0156250

1599981
Total Time:     00:00:00.1562500

1599982
Total Time:     00:00:00.1562500

1599983
Total Time:     00:00:00.1562500

1599984
Total Time:     00:00:00.1562500

1599985
Total Time:     00:00:00.1562500

1599986
Total Time:     00:00:00.1562500

1599987
Total Time:     00:00:00.1562500

1599988
Total Time:     00:00:00.1562500

1599989
Total Time:     00:00:00.1562500

1599990
Total Time:     00:00:00.1562500

2600000
Total Time:     00:00:00.2500000

2600001
Total Time:     00:00:00.2500000

13199998
Total Time:     00:00:01.2968750

35000000
Total Time:     00:00:03.5468750

35000001
Total Time:     00:00:03.5468750

35199981
Total Time:     00:00:03.5625000

35199982
Total Time:     00:00:03.5625000

35199983
Total Time:     00:00:03.5625000

35199984
Total Time:     00:00:03.5625000

35199985
Total Time:     00:00:03.5625000

35199986
Total Time:     00:00:03.5781250

35199987
Total Time:     00:00:03.5781250

35199988
Total Time:     00:00:03.5781250

35199989
Total Time:     00:00:03.5781250

35199990
Total Time:     00:00:03.5781250

35200000
Total Time:     00:00:03.5781250

35200001
Total Time:     00:00:03.5781250

117463825
Total Time:     00:00:12.3437500

500000000
Total Time:     00:00:54.5781250

500000001
Total Time:     00:00:54.5781250

500199981
Total Time:     00:00:54.5937500

500199982
Total Time:     00:00:54.5937500

500199983
Total Time:     00:00:54.5937500

500199984
Total Time:     00:00:54.5937500

500199985
Total Time:     00:00:54.5937500

500199986
Total Time:     00:00:54.5937500

500199987
Total Time:     00:00:54.5937500

500199988
Total Time:     00:00:54.5937500

500199989
Total Time:     00:00:54.5937500

500199990
Total Time:     00:00:54.5937500

500200000
Total Time:     00:00:54.5937500

500200001
Total Time:     00:00:54.5937500

501599981
Total Time:     00:00:54.7500000

501599982
Total Time:     00:00:54.7500000

501599983
Total Time:     00:00:54.7500000

501599984
Total Time:     00:00:54.7500000

501599985
Total Time:     00:00:54.7500000

501599986
Total Time:     00:00:54.7500000

501599987
Total Time:     00:00:54.7500000

501599988
Total Time:     00:00:54.7500000

501599989
Total Time:     00:00:54.7500000

501599990
Total Time:     00:00:54.7500000

502600000
Total Time:     00:00:54.8593750

502600001
Total Time:     00:00:54.8593750

513199998
Total Time:     00:00:56.0312500

535000000
Total Time:     00:00:58.4531250

535000001
Total Time:     00:00:58.4531250

535199981
Total Time:     00:00:58.4687500

535199982
Total Time:     00:00:58.4687500

535199983
Total Time:     00:00:58.4687500

535199984
Total Time:     00:00:58.4687500

535199985
Total Time:     00:00:58.4687500

535199986
Total Time:     00:00:58.4687500

535199987
Total Time:     00:00:58.4687500

535199988
Total Time:     00:00:58.4687500

535199989
Total Time:     00:00:58.4687500

535199990
Total Time:     00:00:58.4687500

535200000
Total Time:     00:00:58.4687500

535200001
Total Time:     00:00:58.4687500

1111111110
Total Time:     00:02:03.2031250

Start Time:     2006-9-10 19:12:29
End Time:       2006-9-10 19:14:32
Total Time:     00:02:03.2031250
运行结束!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值