f(n) = n的优化(二)
对程序做了进一步优化,目前总耗时1分20秒。
代码如下:
///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
运行结束!