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

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

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

///jailusd@hotmail.com
///2006-09-10
///

/*
 * 题目:;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的时间。为了不影响大家的思路,我最后贴上我的程序。

语言不限,随便了。
 
*/


using System;
using System.Collections.Generic;
using System.Text;

namespace ping4210_1
{
    
class Program
    
{
        
static void Main(string[] args)
        
{
            Count();

            Console.ReadLine();
        }


        
static void Count()
        
{
            DateTime dtStart 
= DateTime.Now;
            DateTime dtEnd;

            TimeSpan ts;
            
double count;

            Int32 N 
= 1;          //自然数N
            bool bl = true;
            
int intCount = 0;     //1的总个数

            
int intTemp = 0;      //当前数字含1的个数
            int a,b;

            Console.WriteLine(
"满足f(n) = n的n值列表:");

            
//核心代码
            while (bl)
            
{
                
if (N % 10 == 1)
                
{
                    intCount
++;
                }

                
else if (N % 10 == 0)
                
{
                    intTemp 
= 0;    //统计1的个数

                    b 
= N;
                    
while (b > 0)
                    
{
                        a 
= b % 10;
                        
if (a == 1)
                        
{
                            intTemp
++;
                        }

                        b 
= (b - a) / 10;
                    }

                }


                intCount 
+= intTemp;

                
//判断N值是否与1的个数相等
                if (intCount == N)
                
{
                    Console.WriteLine(N.ToString());

                    
//显示当前计算时间
                    ts = DateTime.Now.Subtract(dtStart);
                    count 
= ts.TotalMilliseconds;
                    Console.WriteLine(
"Total Time:\t" + ts);
                    Console.WriteLine();
                }


                
//当N值等于多少时停止程序11111111111
                if (N == 11111111111)
                
{
                    bl 
= false;
                }


                N
++;
            }

            
//核心代码结束

            
//显示最张运行时间
            dtEnd = DateTime.Now;

            ts 
= DateTime.Now.Subtract(dtStart);
            count 
= ts.TotalMilliseconds;

            Console.WriteLine();
            Console.WriteLine(
"Start Time:\t" + dtStart);
            Console.WriteLine(
"End Time:\t" + dtEnd);
            Console.WriteLine(
"Total Time:\t" + ts);

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

    }

}


最后运行结果如下:
满足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
运行结束!

posted @ 2006-09-10 19:24  Jailu  阅读(431)  评论(1)    收藏  举报