phyeas
我是程序员?我是程序员!
BlogJava
首页
新随笔
联系
聚合
管理
随笔 - 25 文章 - 32 trackbacks - 0
<
2008年6月
>
日
一
二
三
四
五
六
25
26
27
28
29
30
31
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
1
2
3
4
5
常用链接
我的随笔
我的文章
我的评论
我的参与
最新评论
留言簿
(2)
给我留言
查看公开留言
查看私人留言
随笔档案
2009年3月 (1)
2009年2月 (1)
2009年1月 (1)
2008年11月 (4)
2008年10月 (3)
2008年9月 (4)
2008年8月 (2)
2008年7月 (5)
2008年6月 (4)
2008年5月 (2)
文章分类
Seam项目实战(5)
文章档案
2008年12月 (5)
相册
p
搜索
最新评论
1. re: EL表达式中的字符串与数字相加
rr
--2
2. re: 文本比较算法的实现
樓主,請問是否有關於 文本比较算法的实现C#實現的源碼,懇請Email一份給我,感激不盡 我的Emali地址: dath_li@thoughtchina.com.cn
--dath
3. re: MVC与三层架构的异同点
太谢谢你了 非常受益
--body
4. re: Seam新手实战(4):外键[未登录]
我是看着这长大的
--s
5. re: MVC与三层架构的异同点
这个是我看过的比较易懂的讲述。
--re: 软件工程国家标准文档[下载]
阅读排行榜
1. MVC与三层架构的异同点(11918)
2. JAVA之理解break label;(6149)
3. EL表达式中的字符串与数字相加(5514)
4. 文本比较算法的实现(3496)
5. 使用MySQL的limit必须写order by....(3457)
评论排行榜
1. 开源消息平台的构想(初始阶段)(6)
2. 文本比较算法的实现2(3)
3. 将数字形式转换为人民币大写形式的程序实现(3)
4. JAVA语音聊天程序 - 服务器的设计(二)(2)
5. 关于Struts的BeanUtils.populate与LazyDynaBean联用(2)
求1到2008080808之间含有数字7的个数总和? 其实没那么复杂
在CSDN上看到的题..看到很多人的算法都挺复杂的..
从小的数字看起..10里有1个100是10的10倍.但是100里还有70-79都是..所以就是 1*9+10=19个
那么1000就是 (1*9+10)*9+100
10000就是 ((1*9+10)*9+100)*9+1000嗯.是麻烦.所以要把公式提炼出来把这个算术式分析一下。就可以得到公式
这个东西算出来就是9*9*9+810+900+1000=9的三次方*10的0次方+9的2次方*10的一次方 + 9的1次方*10的2次方+9的0次方*10的3次方
(9*9*9) (810) (900) (1000)
如果把 求1到2008080808之间含有数字7的个数总和? 简化为 求 10000以内的含有数字7的数的应该这样9的3次方*10的0次方 + 9的2次方*10的1次方 + 9的1次方*10的2次方 + 9的0次方+10的3次方
其实就是要求N位数的含有某数字的个数先求出N为数的最小数a然后计算a以内有多少个acount=9的n-2次方*10的0次方 + .... + 9的0次方*10的n-2次方.
然后用该整数除以a得到该整数是a的b倍..再用b*acount.得出该整数减去该整数除以a的余数包含的所有包含该数字的数的数量依次类推..
这个可以一直做下去。 2008080808 = 2000000000 先求出 2000000000 包含的个数 8000000 再求8000000内包含的个数 800 ... 8 ...
(改天附上程序实现)
一下是程序实现:
package
org.phyeas.demo;
public
class
Main
{
public
static
void
main(String[] args)
{
System.out.println(lookUpForHasNumber(
2008080808
,
7
));
}
/** */
/**
* 查找从从1到end含有数字hasNumber的个数
*
*
@param
end
* 结束
*
@param
hasNumber
* 含有某数字
*
@return
*/
public
static
int
lookUpForHasNumber(
long
end,
int
hasNumber)
{
int
count
=
0
;
long
less
=
getLess(end);
while
(less
>
10
)
{
int
n
=
(
int
) Math.log10(less);
long
bei
=
end
/
less;
int
tempCount
=
0
;
for
(
int
i
=
n
-
1
, j
=
0
; i
>=
0
; i
--
, j
++
)
{
tempCount
+=
Math.pow(
9
, i)
*
Math.pow(
10
, j);
}
if
(bei
>=
1
)
{
if
(bei
>
hasNumber)
{
tempCount
=
(
int
) ((
int
) (tempCount
*
(bei
-
1
))
+
less);
}
else
if
(bei
==
hasNumber)
{
tempCount
=
(
int
) (tempCount
*
bei)
+
1
;
}
else
{
tempCount
=
(
int
) (tempCount
*
bei);
}
}
count
+=
tempCount;
end
=
end
-
less
*
bei;
less
=
getLess(end);
}
if
(less
>
hasNumber)
{
count
=
count
+
1
;
}
//
System.out.println("count=" + count);
return
count;
}
/** */
/**
* 获取与这个数字位数相同的最小数
*
*
@param
number
*
@return
*/
public
static
long
getLess(
long
number)
{
if
(number
>
10
)
{
String str
=
String.valueOf(number);
StringBuffer nStr
=
new
StringBuffer(
"
1
"
);
for
(
int
i
=
1
; i
<
str.length(); i
++
)
{
nStr.append(
"
0
"
);
}
return
Long.parseLong(nStr.toString());
}
return
number;
}
}
最后结果:1229473242
posted on 2008-06-18 23:11
phyeas
阅读(384)
评论(1)
编辑
收藏
FeedBack:
#
re: 求1到2008080808之间含有数字7的个数总和? 其实没那么复杂
2008-06-20 09:37
phyeas
上面的公式解释可能有误..其实应该是加入该数为10的n次方.那么求该数内含有某数字(1-9)的数的总和为
count=9的n-1次方*10的0次方 + .... + 9的0次方*10的n-1次方
回复
更多评论
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
知识库
C++博客
博问
管理