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

对程序做了进一步优化,目前总耗时1分20秒。

代码如下:

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

/*
 * 题目:;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;

            
int 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
++;
                    intCount 
+= intTemp;
                }

                
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;
                }

                
else if (N % 10 == 2)
                
{
                    intCount 
+= intTemp;
                    
if ((intCount >= N) && (intCount <= (N + 8)))
                    
{
                    }

                    
else
                    
{
                        N 
+= 7;
                        intCount 
+= (7 * intTemp);
                    }

                }

                
else
                
{
                    intCount 
+= intTemp;
                }


                
//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 >= 1111111111)
                
{
                    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.0937500

1599982
Total Time:     00:00:00.0937500

1599983
Total Time:     00:00:00.0937500

1599984
Total Time:     00:00:00.1093750

1599985
Total Time:     00:00:00.1093750

1599986
Total Time:     00:00:00.1093750

1599987
Total Time:     00:00:00.1093750

1599988
Total Time:     00:00:00.1093750

1599989
Total Time:     00:00:00.1093750

1599990
Total Time:     00:00:00.1093750

2600000
Total Time:     00:00:00.1718750

2600001
Total Time:     00:00:00.1718750

35000000
Total Time:     00:00:02.2656250

35000001
Total Time:     00:00:02.2656250

35199981
Total Time:     00:00:02.2812500

35199982
Total Time:     00:00:02.2812500

35199983
Total Time:     00:00:02.2812500

35199984
Total Time:     00:00:02.2812500

35199985
Total Time:     00:00:02.2968750

35199986
Total Time:     00:00:02.2968750

35199987
Total Time:     00:00:02.2968750

35199988
Total Time:     00:00:02.2968750

35199989
Total Time:     00:00:02.2968750

35199990
Total Time:     00:00:02.2968750

35200000
Total Time:     00:00:02.2968750

35200001
Total Time:     00:00:02.2968750

500000000
Total Time:     00:00:35.3593750

500000001
Total Time:     00:00:35.3750000

500199981
Total Time:     00:00:35.3906250

500199982
Total Time:     00:00:35.3906250

500199983
Total Time:     00:00:35.3906250

500199984
Total Time:     00:00:35.3906250

500199985
Total Time:     00:00:35.3906250

500199986
Total Time:     00:00:35.3906250

500199987
Total Time:     00:00:35.3906250

500199988
Total Time:     00:00:35.3906250

500199989
Total Time:     00:00:35.3906250

500199990
Total Time:     00:00:35.3906250

500200000
Total Time:     00:00:35.4062500

500200001
Total Time:     00:00:35.4062500

501599981
Total Time:     00:00:35.5000000

501599982
Total Time:     00:00:35.5000000

501599983
Total Time:     00:00:35.5000000

501599984
Total Time:     00:00:35.5156250

501599985
Total Time:     00:00:35.5156250

501599986
Total Time:     00:00:35.5156250

501599987
Total Time:     00:00:35.5156250

501599988
Total Time:     00:00:35.5156250

501599989
Total Time:     00:00:35.5156250

501599990
Total Time:     00:00:35.5156250

502600000
Total Time:     00:00:35.5937500

502600001
Total Time:     00:00:35.5937500

535000000
Total Time:     00:00:37.9218750

535000001
Total Time:     00:00:37.9218750

535199981
Total Time:     00:00:37.9375000

535199982
Total Time:     00:00:37.9375000

535199983
Total Time:     00:00:37.9375000

535199984
Total Time:     00:00:37.9531250

535199985
Total Time:     00:00:37.9531250

535199986
Total Time:     00:00:37.9531250

535199987
Total Time:     00:00:37.9531250

535199988
Total Time:     00:00:37.9531250

535199989
Total Time:     00:00:37.9531250

535199990
Total Time:     00:00:37.9531250

535200000
Total Time:     00:00:37.9531250

535200001
Total Time:     00:00:37.9531250

1111111110
Total Time:     00:01:20.2812500


Start Time:     2006-9-11 2:00:05
End Time:       2006-9-11 2:01:25
Total Time:     00:01:20.2812500
运行结束!

posted @ 2006-09-11 10:13  Jailu  阅读(530)  评论(2编辑  收藏  举报