This page looks plain and unstyled because you're using a non-standard compliant browser. To see it in its best form, please upgrade to a browser that supports web standards. It's free and painless.
| « | 七月 2009 | » | ||||
|---|---|---|---|---|---|---|
| 一 | 二 | 三 | 四 | 五 | 六 | 日 |
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | 30 | 31 | ||
出口香烟
FC 4下安装ORACLE 9i 的全过程
安装Linux 的硬盘分区
C语言面试题大汇总之华为面试题
面试经典试题
C/C++ 程序设计员应聘常见面试试题深入剖析
美国军工五巨头简介
经典面试问题回答思路
老师的语录
华为公司 java 面试题
有一个整数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的时间。为了不影响大家的思路,我最后贴上我的程序。
原贴http://community.csdn.net/expert/topic/4211/4211591.xml
对于用字符串s表示的整数z,小于等于它的数中包含多少个1可以简单的分析s的各个位上的数值来表示出来。方法如下:
取字符串为a0a1a2a3a4a5,数字表示下标,简要举6位作为示例。比如a3位,它右边a4a5,我的算法只考虑该位对于它右边各位的影响。
定义一个递归函数int CountOne(string s)求结果
若a3=0,则对右面的贡献为CountOne(a4a5);
若a3=1,则对右面的贡献为:a4a5的值+1+CountOne(a4a5)+CountOne(a3位的权值-1)。上式中a4a5的值+1表示从100-1a4a5这些数在a3所在的百位的1的个数,CountOne(a4a5)表示从100-1a4a5这些数中a3右边各位中1的个数,CountOne(a3位的权值-1)的值表示从000-099这些数中a3右边各位中含有的1的个数。
若a3>=2则对右边的贡献为:a3本位权值+CountOne(a4a5),+CountOne(a3位的权值-1)×a3的值。上式中本位权值表示从100-199这个100个数,CountOne(a4a5)表示从a300-a3a4a5这些数中a3右边各位中1的个数,CountOne(a3位的权值-1)×a3的值表示从000-(a300-1)这些数中a3右边各位中含有的1的个数。例如a3=4,则表示从000-099,100-199,200-299,300-399这400个数中各位和十位包含的1的个数。
例如求54321中千位4对右边各位的影响,则是case3,1000+CountOne(321)+CountOne(999)×4,结果我没有算,估计正确。我测试原题中1111111110,结果正确,时间为0.012秒,硬件为p43.0,512M内存,硬件较好,不过我觉得我的算法也不麻烦,大家评议。欢迎批评,qq83508052,msn:boylezhang@hotmail.com
代码:
using System;
using System.IO;
using System.Xml;
using System.Xml.XPath;
using System.Threading;
using System.Timers;
public class Sample
{
static void Main()
{
//Application.Run(new PagingSample());
string s="";
System.Console.Write("Input N:");
s = System.Console.ReadLine();
DateTime dt1 = DateTime.Now;
int count = CountOne(s);
System.Console.WriteLine("f("+s+")={0}",count);
DateTime dt2 = DateTime.Now;
TimeSpan ts = dt2.Subtract(dt1);
System.Console.WriteLine("{0:d}",ts.ToString());
System.Console.ReadLine();
}
public static void OnTimer(Object source, ElapsedEventArgs e)
{
Console.WriteLine("Hello World!");
}
public static int CountOne( string s )
{
s= TrimZeroAHead(s);
char[] array = s.ToCharArray();
int i=0,length=array.Length ;
int n = int.Parse(s);
if(n==0)
return 0;
if(n<10&&n>0)
return 1;
char c=array[length-1];
string sub="";
int count=0;
i=0;
sub=s.Substring(i+1);
c = array[i];
if(c=='0')
{
count+=CountOne(sub);
return 0;
}
else
{
if(c=='1')
{
int a = (int)Math.Pow(10,length-i-1)-1;
string temp = a.ToString();
count += 1+int.Parse(sub)+CountOne(sub)+CountOne(temp);
//return count;
}
else
{//c>=2
int multi = int.Parse(c.ToString());
int a = (int)Math.Pow(10,length-i-1)-1;
string temp = a.ToString();
count += (a+1)+CountOne(sub)+CountOne(temp)*multi;
//return count;
}
}
return count;
}
public static string TrimZeroAHead(string s)
{
int i=0;
for(i=0;i<s.Length-1;i++)
if(s[i]!='0')
break;
return s.Substring(i);
}
}
我也用pl/sql 写了一个
ops$admin@CRMM>select fn(1111111110) from dual;
FN(1111111110)
--------------
1111111110
Elapsed: 00:00:00.00
ops$admin@CRMM>select fn(2111111110) from dual;
FN(2111111110)
--------------
2899999999
Elapsed: 00:00:00.00
create or replace function f(n in number) return number is
n_len number;
n_l_num number;
cnt number;
begin
n_len := length(to_char(n));
if n_len = 1 then
return 1;
end if;
cnt := 1;
for i in 1..n_len - 2 loop
cnt := power(10,i)+10*cnt;
end loop;
return cnt;
end f;
create or replace function fn(n in number) return number is
n_len number;
n_l_num number;
cnt number;
begin
n_len := length(to_char(n));
cnt := 0;
if n_len = 1 then
return 1;
end if;
for i in 1..n_len - 1 loop
cnt := f(power(10,n_len - i))* to_number(substr(n,i,1)) + cnt ;
if substr(n,i,1) = 1 then
cnt := cnt + to_number(substr(n,i+1)) + 1;
elsif substr(n,i,1) > 1 then
cnt := cnt + power(10,n_len - i );
end if;
end loop;
if mod(n,10) > 0 then
cnt := cnt + 1;
end if;
return cnt;
end fn;
sorry
没注意是寻找这个值。 这样需要解决外层算法的变补长问题了。
biti_rainy | 12/10/2005, 17:37
好文章
海是无边无际的,朋友是QQ438885983
hseoudf | 28/10/2006, 08:56