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
运行结束!


浙公网安备 33010602011771号