[ThinkingDog]是一個(gè)積極向上、樂觀、熱心的人。
沉思的狗の博客
[ThinkingDog]歡迎您的光臨,請多多指教!
正整數(shù)中數(shù)字1的計(jì)數(shù)問題 [C++]
/**/
/*
*******************************************************************
purpose:
在從1到n的正數(shù)中1出現(xiàn)的次數(shù)
題目:輸入一個(gè)整數(shù)n,求從1到n這n個(gè)整數(shù)的十進(jìn)制表示中1出現(xiàn)的次數(shù)。
例如輸入12,從1到12這些整數(shù)中包含1 的數(shù)字有1,10,11和12,1一共出現(xiàn)了5次。
求滿足f(i)=i(i<=911111111099999009)這樣的數(shù)總計(jì)有多少個(gè)
********************************************************************
*/
#include
<
iostream
>
#include
<
string
>
#include
<
time.h
>
using
namespace
std;
int
len;
int
*
perDigit;
//
每位上的數(shù)字
long
long
*
fullOne;
//
位數(shù)是n位的數(shù),含1的總個(gè)數(shù)為fullOne[n]
long
long
*
addTopOne;
//
位數(shù)為n的數(shù),首位為1時(shí)有多少個(gè)這樣的數(shù)addTopOne[n] 即10^(n-1)
int
curDigit;
long
long
cnt
=
0
;
long
long
fixBit1
=
0
;
int
ocuur1Cnt
=
0
;
long
long
getOneCnt(
long
long
n)
{
len
=
0
;
while
(n
>
0
)
{
//
把數(shù)字n分成十進(jìn)制串對應(yīng)的數(shù)字?jǐn)?shù)組
perDigit[len]
=
n
%
10
;
n
=
n
/
10
;
len
++
;
}
cnt
=
0
;
fixBit1
=
0
;
//
數(shù)字n中1所在的位被小于此位的數(shù)字重復(fù)的次數(shù)
ocuur1Cnt
=
0
;
//
數(shù)字n有幾位是1
for
(
int
i
=
len
-
1
; i
>=
0
; i
--
)
{
//
從十進(jìn)制數(shù)高位到低位
curDigit
=
perDigit[i];
if
(ocuur1Cnt
>
0
)
{
fixBit1
=
fixBit1
*
10
+
ocuur1Cnt
*
curDigit;
}
if
(curDigit
>
0
)
{
if
(curDigit
==
1
)
{
cnt
+=
curDigit
*
fullOne[i];
ocuur1Cnt
++
;
}
else
{
cnt
+=
curDigit
*
fullOne[i]
+
addTopOne[i];
}
}
}
return
cnt
+
fixBit1
+
ocuur1Cnt;
}
void
HowManyOne(
long
long
topNum)
{
clock_t start, finish;
//
記錄計(jì)算開始結(jié)束時(shí)間
start
=
clock();
len
=
20
;
//
最長20位十進(jìn)制數(shù)
perDigit
=
new
int
[len];
fullOne
=
new
long
long
[len];
addTopOne
=
new
long
long
[len];
fullOne[
0
]
=
0
;
addTopOne[
0
]
=
1
;
cnt
=
1
;
for
(
int
i
=
1
; i
<
len; i
++
)
{
//
初始化信息
fullOne[i]
=
fullOne[i
-
1
]
*
10
+
cnt;
cnt
*=
10
;
addTopOne[i]
=
cnt;
}
long
long
stack[
1000
];
//
存儲數(shù)據(jù)段, [from, to]及計(jì)算方向,每次分別存入from,to,dir
long
long
lRel[
1000
];
//
符合f(i)==i表達(dá)式的i的數(shù)組
int
pStack
=
0
, pRel
=
0
;
//
stack與lRel當(dāng)前長度或下一次存儲位置或棧頂
long
long
from, to, dir;
//
當(dāng)前要驗(yàn)證的一段數(shù)據(jù)的始終與驗(yàn)證方向,驗(yàn)證方向?yàn)?x01(向上) 0x10(向下) 0x11(向上向下均可以)
long
long
fn, dist;
//
fn當(dāng)前一個(gè)數(shù)字n對應(yīng)的1到n所有數(shù)字的十進(jìn)制中的1的總個(gè)數(shù);dist臨時(shí)變量(from與to的差)
stack[
0
]
=
1
;
stack[
1
]
=
topNum;
stack[
2
]
=
3
;
//
0x11
pStack
=
3
;
int
maxP
=
0
;
while
(pStack
>
0
)
{
//
從stack中取出一段數(shù)據(jù),驗(yàn)證其中的i是否滿足f(i)==i
dir
=
stack[
--
pStack];
to
=
stack[
--
pStack];
from
=
stack[
--
pStack];
if
((dir
&
0x01
)
!=
0
)
{
//
UP 從from開始向to的方向計(jì)算 f(i)==i
while
(from
<=
to)
{
fn
=
getOneCnt(from);
if
(fn
>
from)
{
from
=
fn;
}
else
if
(fn
<
from)
{
from
++
;
break
;
}
else
{
lRel[pRel
++
]
=
fn;
from
++
;
}
}
}
if
((dir
&
0x10
)
!=
0
)
{
//
down 從to開始向from的方向計(jì)算 f(i)==i
while
(from
<=
to)
{
fn
=
getOneCnt(to);
if
(fn
<
to)
{
to
=
fn;
}
else
if
(fn
>
to)
{
to
--
;
break
;
}
else
{
lRel[pRel
++
]
=
fn;
to
--
;
}
}
}
if
(to
-
from
<
2
)
{
//
這一段己經(jīng)很小,直接計(jì)算完
for
(;from
<=
to;from
++
)
{
if
(from
==
getOneCnt(from))
{
lRel[pRel
++
]
=
fn;
}
}
}
else
{
//
當(dāng)前段向上向下己計(jì)算完,二分后入棧,再計(jì)算
dist
=
(to
-
from)
>>
1
;
dist
=
from
+
dist;
stack[pStack
++
]
=
from;
stack[pStack
++
]
=
dist;
stack[pStack
++
]
=
0x10
;
stack[pStack
++
]
=
dist
+
1
;
stack[pStack
++
]
=
to;
stack[pStack
++
]
=
0x01
;
}
}
finish
=
clock();
int
i
=
pRel;
while
(i
>
0
)
//
輸出符合f(i)==i的所有i
cout
<<
lRel[
--
i]
<<
endl;
cout
<<
"
time:
"
<<
((
double
)(finish
-
start))
<<
"
ms
"
<<
endl;
cout
<<
"
total:
"
<<
pRel
<<
endl;
}
void
Test_HowManyOne()
{
HowManyOne(911111111099999009LL);
}
輸出為:
199981
199982
199983
199984
199985
199986
199987
199990
199989
199988
200000
200001
1599981
1599982
1599983
1599984
1599985
1599986
1599987
1599988
1599990
1599989
2600000
2600001
13199998
35199981
35199982
35199983
35199984
35199985
35199986
35199987
35199990
35199989
35199988
35000001
35000000
35200000
35200001
117463825
500199981
500199982
500199983
500199984
500199985
500199986
500199987
500199990
500199989
500199988
500200000
500200001
501599981
501599982
501599983
501599984
501599985
501599986
501599987
501599988
501599990
501599989
502600000
502600001
513199998
535199981
535199982
535199983
535199984
535199985
535199986
535199987
535199990
535199989
535199988
535000001
535000000
500000001
500000000
535200000
535200001
1111111110
1
time: 0ms
total: 83
發(fā)表于 2011-05-25 17:51
沉思的狗
閱讀(1279)
評論(3)
編輯
收藏
評論
#
re: 正整數(shù)中數(shù)字1的計(jì)數(shù)問題 [C++]
借鑒了
http://blog.csdn.net/ljsspace/archive/2011/05/22/6437981.aspx
http://topic.csdn.net/u/20110523/12/12a128ad-8a0a-4eb9-b4a1-9cda06f23e39.html?seed=1136147581&r=73511306#r_73511306
冰封空間
評論于 2011-05-25 22:10
回復(fù)
更多評論
#
re: 正整數(shù)中數(shù)字1的計(jì)數(shù)問題 [C++]
樓主為什么沒有main函數(shù)呢?
sf
評論于 2011-05-26 15:39
回復(fù)
更多評論
#
re: 正整數(shù)中數(shù)字1的計(jì)數(shù)問題 [C++]
@sf
void Test_HowManyOne()
這個(gè)函數(shù)改成main就可以了
冰封空間
評論于 2011-05-27 09:18
回復(fù)
更多評論
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發(fā)表評論。
網(wǎng)站導(dǎo)航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
<
2011年5月
>
日
一
二
三
四
五
六
24
25
26
27
28
29
30
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
1
2
3
4
導(dǎo)航
BlogJava
首頁
發(fā)新隨筆
發(fā)新文章
聯(lián)系
聚合
管理
統(tǒng)計(jì)
隨筆: 115
文章: 1
評論: 86
引用: 0
常用鏈接
我的隨筆
我的文章
我的評論
我的參與
最新評論
留言簿
(5)
給我留言
查看公開留言
查看私人留言
隨筆檔案
(115)
2015年1月 (1)
2011年5月 (12)
2011年4月 (2)
2010年9月 (2)
2010年8月 (4)
2009年9月 (1)
2009年6月 (1)
2009年3月 (1)
2008年6月 (1)
2008年1月 (2)
2007年7月 (2)
2007年6月 (2)
2007年5月 (4)
2007年4月 (1)
2007年1月 (1)
2006年12月 (1)
2006年11月 (2)
2006年10月 (2)
2006年9月 (3)
2006年8月 (6)
2006年7月 (1)
2006年6月 (2)
2006年5月 (10)
2006年4月 (50)
2006年3月 (1)
網(wǎng)址
http://blog.csdn.net/Unagain
v_JULY_v
搜索
積分與排名
積分 - 210874
排名 - 266
最新評論
1.?re: 使用Policy文件來設(shè)置Java的安全策略[未登錄]
ss
--啊啊
2.?re: Jni中C++和Java的參數(shù)傳遞
老大,Long 是J啊,不是L啊,可害苦我了,趕緊改回來吧;
--cnhua5
3.?re: Jni中C++和Java的參數(shù)傳遞
樓主,在jni里返回String和C++里獲取的為什么不一樣,比如在java里看到的值是57891234,在C++里顯示的是5789@,這是為什么啊?
--chr
4.?re: 螺旋數(shù)字與坐標(biāo)
對我的項(xiàng)目很有幫助。
謝謝
--cs221313
5.?re: Jni中C++和Java的參數(shù)傳遞
long的符號表寫錯(cuò)了,作為初學(xué)者亞歷山大啊
--hhhhhh
閱讀排行榜
1.?Jni中C++和Java的參數(shù)傳遞 (63525)
2.?本地計(jì)算機(jī)上的 MSSQLSERVER 服務(wù)啟動(dòng)后又停止了。一些服務(wù)自動(dòng)停止,如果它們沒有什么可做的,例如“性能日志和警報(bào)”服務(wù)。[用批處理解決](22461)
3.?使用Policy文件來設(shè)置Java的安全策略(10508)
4.?一個(gè)簡單的十六進(jìn)制計(jì)算器(出自Win程序設(shè)計(jì))(8747)
5.?VC++6.0 全部默認(rèn)快捷鍵(6213)
評論排行榜
1.?Upload Server (HTTP 上傳服務(wù)JAVA程序) 速度極快(11)
2.?Jni中C++和Java的參數(shù)傳遞 (10)
3.?垃圾軟件反刪除批處理文件 (7)
4.?剛寫的八皇后問題 - 遞歸 (隨便你定義幾個(gè)皇后了)JAVA(4)
5.?火車運(yùn)煤問題(4)
Powered by:
博客園
模板提供:
滬江博客
Copyright ©2025 沉思的狗
[ThinkingDog]是一個(gè)積極向上、樂觀、熱心的人。
主站蜘蛛池模板:
亚洲成色www久久网站夜月
|
最近免费中文字幕视频高清在线看
|
成年女性特黄午夜视频免费看
|
亚洲综合色7777情网站777
|
亚洲国产精彩中文乱码AV
|
久久久久亚洲AV成人网人人软件
|
99精品免费观看
|
久久成人免费电影
|
无码中文字幕av免费放dvd
|
久久久久久久久久免免费精品
|
久久精品国产亚洲AV久
|
亚洲国产精品免费在线观看
|
亚洲春色在线观看
|
亚洲免费在线观看视频
|
亚洲日韩乱码久久久久久
|
亚洲欧洲另类春色校园小说
|
91亚洲精品麻豆
|
99久久婷婷国产综合亚洲
|
亚洲国产欧美日韩精品一区二区三区
|
久久久亚洲欧洲日产国码农村
|
日本久久久免费高清
|
日本特黄特色aa大片免费
|
国产精品视频免费一区二区三区
|
夜夜春亚洲嫩草影院
|
免费成人午夜视频
|
亚洲夜夜欢A∨一区二区三区
|
国产网站在线免费观看
|
亚洲国产精品一区二区九九
|
国产亚洲精品成人AA片新蒲金
|
成人毛片18女人毛片免费96
|
亚洲免费视频观看
|
亚洲精品色播一区二区
|
国产亚洲人成在线播放
|
一级A毛片免费观看久久精品
|
亚洲国产精品自在自线观看
|
成年网站免费入口在线观看
|
国产亚洲人成A在线V网站
|
亚洲情a成黄在线观看动漫尤物
|
亚洲精品动漫人成3d在线
|
亚洲精品无码不卡在线播放HE
|
国产大片91精品免费观看男同
|